You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动