如何在Python中打印异常抛出的代码行号?
如何在Python异常中打印代码行号?
我来帮你搞定这个调试难题!你现在的函数虽然能抛出类型错误,但因为手动处理异常的方式没保留堆栈追踪信息,所以看不到行号。下面给你几种简单有效的解决方法:
问题根源分析
首先先修正你代码里的一个小语法错误:raise语句的字符串末尾少了一个闭合引号,这会导致代码无法运行。另外,手动用type(text) == str判断类型不够灵活(比如无法识别子类),更推荐用isinstance(text, str)。
方案1:使用traceback模块打印完整堆栈信息
Python内置的traceback模块可以帮你捕获并打印包含行号的异常堆栈,这是最直接的解决方式。修改后的代码如下:
import traceback def println(text: str): try: print(text) if not isinstance(text, str): raise TypeError(f"argument \"text\" should be type \"str\", not type \"{type(text)}\"") except TypeError as err: print(f"错误信息: {err}") # 打印包含行号的完整异常追踪 traceback.print_exc()
当你传入整数println(123)时,输出会变成这样:
123 错误信息: argument "text" should be type "str", not type "<class 'int'>" Traceback (most recent call last): File "your_script.py", line 6, in println raise TypeError(f"argument \"text\" should be type \"str\", not type \"{type(text)}\"") TypeError: argument "text" should be type "str", not type "<class 'int'>"
你能清晰看到异常是在第6行抛出的,完全满足调试需求。
方案2:用assert简化参数校验(可选)
如果你只是想快速校验参数类型,assert语句会更简洁,结合traceback同样能输出行号:
import traceback def println(text: str): try: # 断言参数类型为str,不满足则抛出异常 assert isinstance(text, str), f"argument \"text\" should be type \"str\", not type \"{type(text)}\"" print(text) except AssertionError as err: traceback.print_exc()
方案3:让异常自然抛出(无需捕获)
如果不需要在函数内部处理异常,直接去掉try-except块,Python默认会打印包含行号的完整堆栈信息:
def println(text: str): print(text) if not isinstance(text, str): raise TypeError(f"argument \"text\" should be type \"str\", not type \"{type(text)}\"")
调用println(123)时,控制台会直接显示异常的行号和详细信息,适合不需要自定义异常处理的场景。
内容的提问来源于stack exchange,提问作者Rydex




