【问题标题】:Exception message (Python 2.6)异常消息(Python 2.6)
【发布时间】:2010-12-15 11:18:38
【问题描述】:

在 Python 中,如果我打开一个不存在的二进制文件,程序会以错误退出并打印:

Traceback (most recent call last):
  File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
  line 4, in <module>
  pkl_file = open('monitor.dat', 'rb')
  IOError: [Errno 2] No such file or directory: 'monitor.dat'

我可以用“try-except”来处理这个问题,比如:

try:
    pkl_file = open('monitor.dat', 'rb')
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
except Exception:
    print 'No such file or directory'

我如何在捕获的异常中打印以下行?

File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
line 11, in <module>
pkl_file = open('monitor.dat', 'rb')

所以程序不会退出。

【问题讨论】:

    标签: python exception-handling message


    【解决方案1】:

    如果要捕获 Exception 传递的异常对象,最好开始使用 Python 2.6 中引入的 NEW 格式(目前支持这两种格式),因为这是在 Python 3 中实现的唯一方法。

    那就是:

    try:
        ...
    except IOError as e:
        ...
    

    例子:

    try:
        pkfile = open('monitor.dat', 'rb')
    except IOError as e:
        print 'Exception error is: %s' % e
    

    详细的概述可以在What's New in Python 2.6 documentation找到。

    【讨论】:

    • 有帮助,但这并没有回答问题。也许作为评论更好?
    【解决方案2】:

    谢谢大家。

    这就是我需要的:)

    import traceback
    
    try:
        # boom
    except Exception:
        print traceback.format_exc()
    

    【讨论】:

    • 您在发表评论时不应创建答案。接受其中一个答案来奖励你的助手!
    • 请花点时间再看看 Ned B 的回答。除了解决您眼前的问题之外,他还提出了几个重要的观点。
    • 谢谢,保罗,但我有一种感觉,我们已经结束了这个问题的活动......
    【解决方案3】:

    这会打印异常消息:

    except Exception, e:
        print "Couldn't do it: %s" % e
    

    这将显示整个回溯:

    import traceback
    
    # ...
    
    except Exception, e:
        traceback.print_exc()
    

    但您可能不想捕获异常。一般来说,你可以使你的捕获越窄越好。所以你可能想试试:

    except IOError, e:
    

    相反。同样关于缩小异常处理的范围,如果您只关心丢失的文件,那么将 try-except 放在 open 周围:

    try:
        pkl_file = open('monitor.dat', 'rb')
    except IOError, e:
        print 'No such file or directory: %s' % e
    
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
    

    【讨论】:

    • @Josh 这个答案和这个答案差不多。
    【解决方案4】:

    Python 有 traceback 模块。

    import traceback
    try:
        pkl_file = open('monitor.dat', 'rb')
        monitoring_pickle = pickle.load(pkl_file)
        pkl_file.close()
    except IOError:
        traceback.print_exc()
    

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 2019-03-08
      • 2023-02-02
      • 2013-09-12
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多