展开全部
通过调用堆栈里面的代码对象来获取。
一般是自己引发一个异常,然后捕获62616964757a686964616fe59b9ee7ad9431333361326337这个异常,在异常处理中通过堆栈信息获得行号。
比如: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.