开发者社区> 问答> 正文

捕获异常后抛出另外的异常

你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。

展开
收起
哦哦喔 2020-04-17 17:34:20 980 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    
    try:
       ...
    except Exception as e:
       # Process exception information in some way
       ...
    
       # Propagate the exception
       raise
    
    
    
    2020-04-17 17:59:48
    赞同 展开评论 打赏
  • 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如:
    
    >>> def example():
    ...     try:
    ...             int('N/A')
    ...     except ValueError as e:
    ...             raise RuntimeError('A parsing error occurred') from e
    ...
    >>> example()
    Traceback (most recent call last):
      File "<stdin>", line 3, in example
    ValueError: invalid literal for int() with base 10: 'N/A'
    上面的异常是下面的异常产生的直接原因:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in example
    RuntimeError: A parsing error occurred
    >>>
    在回溯中可以看到,两个异常都被捕获。 要想捕获这样的异常,你可以使用一个简单的 except 语句。 不过,你还可以通过查看异常对象的 __cause__ 属性来跟踪异常链。例如:
    
    try:
        example()
    except RuntimeError as e:
        print("It didn't work:", e)
    
        if e.__cause__:
            print('Cause:', e.__cause__)
    当在 except 块中又有另外的异常被抛出时会导致一个隐藏的异常链的出现。例如:
    
    >>> def example2():
    ...     try:
    ...             int('N/A')
    ...     except ValueError as e:
    ...             print("Couldn't parse:", err)
    ...
    >>>
    >>> example2()
    Traceback (most recent call last):
      File "<stdin>", line 3, in example2
    ValueError: invalid literal for int() with base 10: 'N/A'
    在处理上述异常的时候,另外一个异常发生了:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in example2
    NameError: global name 'err' is not defined
    >>>
    这个例子中,你同时获得了两个异常的信息,但是对异常的解释不同。 这时候,NameError 异常被作为程序最终异常被抛出,而不是位于解析异常的直接回应中。
    
    如果,你想忽略掉异常链,可使用 raise from None :
    
    >>> def example3():
    ...     try:
    ...             int('N/A')
    ...     except ValueError:
    ...             raise RuntimeError('A parsing error occurred') from None
    ...
    >>>
    example3()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in example3
    RuntimeError: A parsing error occurred
    >>>
    
    2020-04-17 17:34:29
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载