【问题标题】:Python try/except: Showing the cause of the error after displaying my variablesPython try/except:显示我的变量后显示错误原因
【发布时间】:2010-12-30 05:43:26
【问题描述】:

我什至不确定要搜索什么合适的词。我想在 except 块中显示部分错误对象(类似于 VBScript 中的 err 对象,它具有 Err.Number 和 Err.Description)。例如,我想显示我的变量的值,然后显示确切的错误。显然,我在下面导致了一个被零除的错误,但是我怎样才能打印出这个事实呢?

try: 
    x = 0 
    y = 1 
    z = y / x 
    z = z + 1 
    print "z=%d" % (z) 
except: 
    print "Values at Exception: x=%d y=%d " % (x,y) 
    print "The error was on line ..." 
    print "The reason for the error was ..." 

【问题讨论】:

    标签: python exception-handling


    【解决方案1】:
    try:  
        1 / 0 
    except Exception as e: 
        print(e)
    

    【讨论】:

    • 它给出了原因,这就是您最初的问题所要求的。
    • Python 3 语法:将 print e 替换为 print (e)
    【解决方案2】:

    如果您预计会出现 DivideByZero 错误,您可以捕获该特定错误

    import traceback
    try:
      x = 5
      y = 0
      print x/y
    except ZeroDivisionError:
      print "Error Dividing %d/%d" % (x,y)
      traceback.print_exc()
    except:
      print "A non-ZeroDivisionError occurred"
    

    可以通过调用traceback.print_exc()手动获取行号等信息

    【讨论】:

    • 谢谢。我真的在寻找“回溯”——不记得它叫什么了,因为我在寻找错误或异常对象。
    • The DivideByZero 只是我的帖子中使用的一个简单错误,我的实际情况要复杂得多。
    【解决方案3】:

    the exception object 的字符串值会告诉你原因。 traceback 模块将允许您访问完整的回溯。

    【讨论】:

      【解决方案4】:

      更好的方法是使用标准Python Logging module

      import sys, traceback, logging
      
      logging.basicConfig(level=logging.ERROR)
      
      try: 
          x = 0 
          y = 1 
          z = y / x 
          z = z + 1 
          print "z=%d" % (z) 
      except: 
          logging.exception("Values at Exception: x=%d y=%d " % (x,y))
      

      这会产生以下输出:

      ERROR:root:Values at Exception: x=0 y=1 
      Traceback (most recent call last):
        File "py_exceptions.py", line 8, in <module>
          z = y / x
      ZeroDivisionError: integer division or modulo by zero
      

      使用日志记录模块的优点是您可以访问所有花哨的日志处理程序(系统日志、电子邮件、旋转文件日志),如果您希望将异常记录到多个目的地,这很方便。

      【讨论】:

      • 如果不使用systraceback,为什么还要导入它们?
      【解决方案5】:

      换句话说,

      try:
          1/0
      except Exception as e:
          print e
      

      您可以在 Ignacio 在他的回复中链接的手册页中获取详细信息。

      【讨论】:

        【解决方案6】:

        如果你这样做

        except AssertionError as error:
            print(error)
        

        那么这应该会使您的程序与跟踪和一切崩溃,就好像 try/except 不存在一样。但无需更改缩进和注释行。

        【讨论】:

          【解决方案7】:

          一般避免在异常后手动打印变量。如果这被告知每个开发人员,将会节省很多时间。只是不要做可以自动化的工作。

          改用工具来升级您的错误消息。一劳永逸。

          只需一个pip install,您就会得到这个(图片取自其中一种工具): 无需在代码中插入大量打印和格式。

          看看traceback-with-variablestbvaccinepretty-errorsbetter-exception和其他pypi工具。

          【讨论】:

            猜你喜欢
            • 2021-06-22
            • 2021-06-22
            • 2016-05-09
            • 2021-09-11
            • 2022-11-27
            • 2016-04-26
            • 2018-08-01
            • 2021-12-15
            • 2018-12-11
            相关资源
            最近更新 更多