相关知识点:
__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 inspectclass 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.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)