如何打印出当前源文件的文件名以及源文件的当

如何打印出当前源文件的文件名以及源文件的当,第1张

相关知识点:

__FILE__ 包含当前程序液桥茄文件名的字符串__LINE__  表示当前行号的整数__DATE__ 包闹察含当前日期的字符串__STDC__  如果编译器遵循ANSI C标准,它就是个非零值__TIME__ 包含当前时间的字符串

例程:

#include <消滑stdio.h>int main(void){    printf("当前文件名:%s\",__FILE__)//输出当前程序文件名    printf("当前行号:%s\n",__LINE__)//输出源文件的当前行号    return 0}   

通过调用堆栈里面的代码对象来获取。

一般是自己引发一个异常,然后捕获这个异常,在异常处理中通过堆栈信息获得行号。

比如:

    try:

 瞎肆       raise ZeroDivisionError

    except ZeroDivisionError:

        frame = sys.exc_info()[2].tb_frame.f_back

    return frame.f_lineno

如果需要更多的信息,可以通过inspect模块的stack()方法获得整个调用栈。可自定义一个exception类型。

import inspect

class MyErrorCode(object):

    STANDARD = 0x0001

    

code_map_msg = {

    MyErrorCode.STANDARD: "standard error",

}

class MyError(Exception):

    def __init__(self, error_code):

        self.error_code = error_code

        try:

            _current_call = inspect.stack()[1]

            _iframe = _current_call[0]

            self.line_no = _iframe.f_lineno

         磨孝轿   self.module_name = _iframe.f_globals.get("__name__", "")

            self.method_name = _current_call[3]

            self.class_name = _iframe.f_locals.get("self", None).__class__.__name__

        except (IndexError, AttributeError):

            self.line_no = ""

            self.module_name = ""

            self.method_name = 慎纳""

            self.class_name = ""

    

    def __repr__(self):

        msg = code_map_msg.get(self.error_code, "")

        return "[*] MyError: %s > %s. module: %s, class: %s, method: %s, line: %s " % (self.error_code, msg, self.module_name, self.class_name, self.method_name, self.line_no)

    

    def __str__(self):

        return code_map_msg.get(self.error_code, "not find any match msg for code: %s" % self.error_code)

然后在需要获取行号的地方引发这个异常并捕获它,然后从异常对象中获取line_no.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8162429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存