python的try except异常的捕获方式

本文介绍两种Python中处理错误的方法:一种是基本的try-except结构,仅提供简单的错误信息;另一种使用traceback模块,能够获取详细的错误堆栈信息,便于调试。文章还提及了使用日志记录错误的方式。
部署运行你感兴趣的模型镜像

有两种:
1、

def test(arr):
    try:
        a = int(arr)
        print(a)
    except Exception as e:
        print('error', e)
        
test('adff')

这种捕获方式有个问题,那就是只打印最简略的错误信息:

error invalid literal for int() with base 10: 'adff'

2、这种可以获得更详细错误信息来debug:


import traceback

def test(arr):
    try:
        a = int(arr)
        print(a)
    except:
        traceback.print_exc()

test('adff')

输出结果如下:

Traceback (most recent call last):
  File "", line 37, in test
    a = int(arr)
ValueError: invalid literal for int() with base 10: 'adff'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "", line 42, in <module>
    test('adff')
  File "", line 40, in test
    traceback.print_exec()
AttributeError: module 'traceback' has no attribute 'print_exec'

如果用日志来记录的话,就改成:

logging.error('xxxx', exc_info=True)

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Pythontry-except语句捕获异常失效的原因及解决方法 在Python中,`try-except`语句用于捕获和处理程序运行时可能出现的异常。然而,在某些情况下,`try-except`可能无法正常工作,导致异常未被捕获或程序崩溃。以下是可能导致`try-except`失效的原因以及相应的解决方案[^1]。 #### 1. 异常类型不匹配 `except`语句需要明确指定要捕获异常类型。如果抛出的异常与`except`块中定义的异常类型不匹配,则该异常不会被捕获。例如: ```python try: result = 1 / 0 except ValueError: # 这里只捕获ValueError,但实际抛出的是ZeroDivisionError print("Caught an exception") ``` 在这种情况下,`ZeroDivisionError`不会被`ValueError`捕获,从而导致程序崩溃。为了解决这个问题,可以捕获更广泛的异常类型或直接使用`Exception`类来捕获所有非系统退出的异常[^2]。 ```python try: result = 1 / 0 except ZeroDivisionError: # 捕获正确的异常类型 print("Division by zero is not allowed") ``` 或者: ```python try: result = 1 / 0 except Exception as e: # 捕获所有异常 print(f"An error occurred: {e}") ``` #### 2. `exit()`或`sys.exit()`的使用 在`try`块中调用`exit(0)`或`sys.exit(0)`会导致程序立即终止,而不会执行`except`块中的代码。这是因为`exit()`和`sys.exit()`实际上会引发`SystemExit`异常,而默认情况下,这种异常不会被普通的`except`块捕获。如果需要捕获此类异常,可以在`except`块中显式指定`SystemExit`[^3]。 ```python import sys try: sys.exit(0) # 触发SystemExit异常 except SystemExit: # 显式捕获SystemExit print("SystemExit was caught") ``` #### 3. 异常发生在`try`块之外 如果异常发生在`try`块之外,则`except`块无法捕获异常。例如: ```python try: pass # try块为空 result = 1 / 0 # 异常发生在try块之外 except ZeroDivisionError: print("Caught an exception") ``` 上述代码中,`ZeroDivisionError`发生在`try`块之外,因此无法被捕获。确保将所有可能引发异常的代码放在`try`块内是解决问题的关键[^4]。 ```python try: result = 1 / 0 # 将潜在异常代码放入tryexcept ZeroDivisionError: print("Caught an exception") ``` #### 4. 使用`except: pass`忽略异常 虽然`except: pass`可以忽略所有异常并让程序继续运行,但这是一种不良的编程习惯,因为它可能会掩盖潜在的问题。建议仅捕获特定类型的异常,并在必要时记录日志或采取其他措施[^5]。 ```python try: result = int("abc") # 可能引发ValueError except ValueError: # 捕获特定异常 print("Invalid input") ``` #### 5. 异常链的影响 在某些情况下,异常可能被重新抛出或嵌套在另一个异常中,这可能导致`try-except`失效。可以通过检查异常链来定位问题。例如: ```python try: raise ValueError("Original error") except ValueError as e: raise RuntimeError("Chained error") from e ``` 在上述代码中,`RuntimeError`包含了原始的`ValueError`异常链。可以通过访问`__cause__`属性来查看完整的异常链信息[^6]。 ```python try: raise ValueError("Original error") except ValueError as e: print(f"Original error: {e.__cause__}") ``` ### 总结 `try-except`失效的主要原因包括异常类型不匹配、`exit()`或`sys.exit()`的使用、异常发生在`try`块之外、滥用`except: pass`以及异常链的影响。通过明确指定异常类型、捕获`SystemExit`、确保异常代码位于`try`块内、避免滥用`except: pass`以及正确处理异常链,可以有效解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值