python traceback报错,Python traceback_1

  python traceback报错,Python traceback

  对象为处理异常提供了with_traceback传播路径。查看异常的传播路径可以追溯异常触发的源头,还可以一路看到异常触发的轨迹。

  以下示例显示了如何显示异常传播轨迹:

  classSelfException(异常):pass

  defmain():

  firstMethod()

  deffirstMethod():

  第二种方法()

  defsecondMethod():

  第三种方法()

  defthirdMethod():

  RaiseSelfException(“自定义异常信息”)

  Main()上面程序中的main()函数调用firstMethod(),firstMethod()调用secondMethod(),secondMethod()调用thirdMethod(),thirdMethod()直接抛出SelfException异常。运行上面的程序,你会看到如图所示的结果:

  从图中可以看出,异常是从thirdMethod()函数触发的,然后传递给secondMethod()函数,再传递给firstMethod()函数,最后传递给main()函数。这个过程就是Python的异常传播轨迹。

  在实际应用的开发中,大多数复杂的操作都被分解成一系列的函数或方法调用。这是因为,为了具有更好的可复用性,每个可复用的代码单元都会被定义为一个函数或方法,复杂的任务会被逐渐分解成更容易管理的更小的子任务。因为一个大型的业务功能需要通过多个函数或方法来实现,所以在最终的编程模型中,很多对象会通过一系列的函数或方法调用来进行通信和执行任务。

  因此,一个应用在运行时,往往会发生一系列的函数或方法调用,从而形成“函数调用战”。相反,只要没有完全捕捉到异常(包括没有捕捉到异常,或者异常处理后抛出了新的异常),异常就会从发生异常的函数或方法开始逐渐向外扩散,先是到函数或方法的调用者,然后到函数或方法的调用者,最后到Python解释器。这时Python解释器会停止程序,打印异常的传播轨迹信息。

  许多初学者在看到图1所示的异常消息时会感到恐慌。他们认为程序中有许多严重错误,但实际上只有一个错误。系统提示了这么多行信息,只是依次显示了异常触发的轨迹。

  事实上,图中显示的异常传播轨迹的信息非常清楚,它记录了应用程序中执行停止的所有点。最后一行信息详细说明了异常的类型以及异常的详细信息。从这一行开始,依次记录异常的来源和异常传播经过的轨迹,并标明异常发生的文件、行和函数。

  Python专门提供了一个回溯模块来处理异常传播轨迹。使用traceback可以轻松处理Python的异常传播轨迹。导入追溯模块后,追溯提供了以下两种常用方法:

  Traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件。

  Format_exc():将异常传播轨迹信息转换为字符串。

  有些读者可能会好奇。从以上方法中,他们看不出自己处理的是哪些异常传播轨迹信息。其实我们常用的print_exc()就是省略了limit和file两个参数的print_exc([limit[,file]])的形式。而print_exc([limit[,file]])的完整形式是print _ exception (etype,value,TB [,limit[,file]])。在完整形式中,前三个参数分别用于指定异常的以下信息:

  Etype:指定异常类型;

  Value:指定一个异常值;

  Tb:指定异常追溯信息;

  当程序在except块中时,except块捕获的异常信息可以通过sys对象获取,其中sys.exc_type、sys.exc_value和sys.exc_traceback表示当前except块中的异常类型、异常值和异常传播轨迹。

  简单来说,print_exc([limit[,file]])相当于以下形式:

  Print _ exception (sys.exc _ etype,sys.exc _ value,sys.exc _ tb [,limit [,file]])也是

  是说,使用 print_exc([limit[, file]]) 会自动处理当前 except 块所捕获的异常。该方法还涉及两个参数:

  limit:用于限制显示异常传播的层数,比如函数 A 调用函数 B,函数 B 发生了异常,如果指定 limit=1,则只显示函数 A 里面发生的异常。如果不设置 limit 参数,则默认全部显示。

  file:指定将异常传播轨迹信息输出到指定文件中。如果不指定该参数,则默认输出到控制台。

  借助于 traceback 模块的帮助,我们可以使用 except 块捕获异常,并在其中打印异常传播信息,包括把它输出到文件中。例如如下程序:

  

#导入trackback模块

  importtraceback

  classSelfException(Exception):pass

  defmain():

  firstMethod()

  deffirstMethod():

  secondMethod()

  defsecondMethod():

  thirdMethod()

  defthirdMethod():

  raiseSelfException("自定义异常信息")

  try:

  main()

  except:

  #捕捉异常,并将异常传播信息输出控制台

  traceback.print_exc()

  #捕捉异常,并将异常传播信息输出指定文件中

  traceback.print_exc(file=open('log.txt','a'))

上面程序第一行先导入了 traceback 模块,接下来程序使用 except 捕获程序的异常,并使用 traceback 的 print_exc() 方法输出异常传播信息,分别将它输出到控制台和指定文件中。

  运行上面程序,同样可以看到在控制台输出异常传播信息,而且在程序目录下生成了一个 log.txt 文件,该文件中同样记录了异常传播信息。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: