mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
112 lines
45 KiB
HTML
112 lines
45 KiB
HTML
<div class="body" role="main"><div class="section" id="module-traceback"><h1><span class="yiyi-st" id="yiyi-10">29.9. <a class="reference internal" href="#module-traceback" title="traceback: Print or retrieve a stack traceback."><code class="xref py py-mod docutils literal"><span class="pre">traceback</span></code></a> - 打印或检索堆栈跟踪</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/traceback.py">Lib / traceback.py</a></span></p><p><span class="yiyi-st" id="yiyi-12">此模块提供了一个标准接口来提取,格式化和打印Python程序的堆栈跟踪。</span><span class="yiyi-st" id="yiyi-13">它精确地模拟了Python解释器在打印堆栈跟踪时的行为。</span><span class="yiyi-st" id="yiyi-14">当您想在程序控制下打印堆栈跟踪时,例如在解释器周围的“包装器”中,这是非常有用的。</span></p><p id="index-0"><span class="yiyi-st" id="yiyi-15">模块使用跟踪对象 - 这是存储在<a class="reference internal" href="sys.html#sys.last_traceback" title="sys.last_traceback"><code class="xref py py-data docutils literal"><span class="pre">sys.last_traceback</span></code></a>变量中并作为第三个项目从<a class="reference internal" href="sys.html#sys.exc_info" title="sys.exc_info"><code class="xref py py-func docutils literal"><span class="pre">sys.exc_info()</span></code></a>返回的对象类型。</span></p><p><span class="yiyi-st" id="yiyi-16">该模块定义了以下功能:</span></p><dl class="function"><dt id="traceback.print_tb"><span class="yiyi-st" id="yiyi-17"> <code class="descclassname">traceback.</code><code class="descname">print_tb</code><span class="sig-paren">(</span><em>tb</em>, <em>limit=None</em>, <em>file=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-18">如果<em>limit</em>为正,则从跟踪对象<em>tb</em>打印<em>限制</em>堆栈跟踪条目。</span><span class="yiyi-st" id="yiyi-19">否则,打印最后的<code class="docutils literal"><span class="pre">abs(limit)</span></code>条目。</span><span class="yiyi-st" id="yiyi-20">如果省略<em>限制</em>或<code class="docutils literal"><span class="pre">None</span></code>,将打印所有条目。</span><span class="yiyi-st" id="yiyi-21">如果省略<em>文件</em>或<code class="docutils literal"><span class="pre">None</span></code>,输出将转到<code class="docutils literal"><span class="pre">sys.stderr</span></code>;否则应该是一个打开的文件或类似文件的对象来接收输出。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-22"><span class="versionmodified">在3.5版本中有更改:</span>添加了负面<em>限制</em>支持。</span></p></div></dd></dl><dl class="function"><dt id="traceback.print_exception"><span class="yiyi-st" id="yiyi-23"> <code class="descclassname">traceback.</code><code class="descname">print_exception</code><span class="sig-paren">(</span><em>etype</em>, <em>value</em>, <em>tb</em>, <em>limit=None</em>, <em>file=None</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-24">从追踪对象<em>tb</em>到<em>文件</em>中打印异常信息和堆栈跟踪条目。</span><span class="yiyi-st" id="yiyi-25">这与<a class="reference internal" href="#traceback.print_tb" title="traceback.print_tb"><code class="xref py py-func docutils literal"><span class="pre">print_tb()</span></code></a>有以下不同:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-26">如果<em>tb</em>不是<code class="docutils literal"><span class="pre">None</span></code>,则会打印标头<code class="docutils literal"><span class="pre">Traceback</span> <span class="pre">(最近</span> <span class="pre">t6> <span class="pre">call</span> <span class="pre">last):</span></span></code></span></li><li><span class="yiyi-st" id="yiyi-27">它在堆栈跟踪之后打印异常<em>etype</em>和<em>值</em></span></li><li><span class="yiyi-st" id="yiyi-28">如果<em>etype</em>是<a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal"><span class="pre">SyntaxError</span></code></a>和<em>value</em>具有适当的格式,则会使用插入符号来显示语法错误发生的行,错误。</span></li></ul><p><span class="yiyi-st" id="yiyi-29">可选的<em>limit</em>参数与<a class="reference internal" href="#traceback.print_tb" title="traceback.print_tb"><code class="xref py py-func docutils literal"><span class="pre">print_tb()</span></code></a>具有相同的含义。</span><span class="yiyi-st" id="yiyi-30">如果<em>chain</em>为真(默认值),那么也将打印链接异常(<code class="xref py py-attr docutils literal"><span class="pre">__cause__</span></code>或<code class="xref py py-attr docutils literal"><span class="pre">__context__</span></code>属性),如解释器本身在打印未处理的异常时执行。</span></p></dd></dl><dl class="function"><dt id="traceback.print_exc"><span class="yiyi-st" id="yiyi-31"> <code class="descclassname">traceback.</code><code class="descname">print_exc</code><span class="sig-paren">(</span><em>limit=None</em>, <em>file=None</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-32">这是<code class="docutils literal"><span class="pre">print_exception(* sys.exc_info(),</span> <span class="pre">limit,</span> <span class="pre">文件,</span> <span class="pre">链) t4 ></span></code>。</span></p></dd></dl><dl class="function"><dt id="traceback.print_last"><span class="yiyi-st" id="yiyi-33"> <code class="descclassname">traceback.</code><code class="descname">print_last</code><span class="sig-paren">(</span><em>limit=None</em>, <em>file=None</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">这是<code class="docutils literal"><span class="pre">print_exception(sys.last_type,</span> <span class="pre">sys.last_value,</span> <span class="pre">sys.last_traceback,</span> <span class="pre">t4> <span class="pre">文件,</span> <span class="pre">链)</span></span></code>。</span><span class="yiyi-st" id="yiyi-35">通常,只有在异常到达一个交互式提示符后,它才会工作(参见<a class="reference internal" href="sys.html#sys.last_type" title="sys.last_type"><code class="xref py py-data docutils literal"><span class="pre">sys.last_type</span></code></a>)。</span></p></dd></dl><dl class="function"><dt id="traceback.print_stack"><span class="yiyi-st" id="yiyi-36"> <code class="descclassname">traceback.</code><code class="descname">print_stack</code><span class="sig-paren">(</span><em>f=None</em>, <em>limit=None</em>, <em>file=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-37">如果<em>limit</em>为正,则打印到<em>limit</em>堆栈跟踪条目(从调用点开始)。</span><span class="yiyi-st" id="yiyi-38">否则,打印最后的<code class="docutils literal"><span class="pre">abs(limit)</span></code>条目。</span><span class="yiyi-st" id="yiyi-39">如果省略<em>限制</em>或<code class="docutils literal"><span class="pre">None</span></code>,将打印所有条目。</span><span class="yiyi-st" id="yiyi-40">可选的<em>f</em>参数可用于指定要开始的备用堆栈帧。</span><span class="yiyi-st" id="yiyi-41">可选的<em>文件</em>参数与<a class="reference internal" href="#traceback.print_tb" title="traceback.print_tb"><code class="xref py py-func docutils literal"><span class="pre">print_tb()</span></code></a>具有相同的含义。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-42"><span class="versionmodified">在3.5版本中有更改:</span>添加了负面<em>限制</em>支持。</span></p></div></dd></dl><dl class="function"><dt id="traceback.extract_tb"><span class="yiyi-st" id="yiyi-43"> <code class="descclassname">traceback.</code><code class="descname">extract_tb</code><span class="sig-paren">(</span><em>tb</em>, <em>limit=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">返回从追溯对象<em>tb</em>提取的“预处理”堆栈跟踪条目的列表。</span><span class="yiyi-st" id="yiyi-45">它对堆栈跟踪的备用格式化很有用。</span><span class="yiyi-st" id="yiyi-46">可选的<em>limit</em>参数与<a class="reference internal" href="#traceback.print_tb" title="traceback.print_tb"><code class="xref py py-func docutils literal"><span class="pre">print_tb()</span></code></a>具有相同的含义。</span><span class="yiyi-st" id="yiyi-47">“预处理”堆栈跟踪条目是4元组(<em>filename</em>,<em>行号</em>,<em>函数名</em>,<em>t3>),表示通常为堆栈跟踪打印的信息。</em></span><span class="yiyi-st" id="yiyi-48"><em>文本</em>是带有前导和尾随空格的字符串;如果源不可用,则为<code class="docutils literal"><span class="pre">None</span></code>。</span></p></dd></dl><dl class="function"><dt id="traceback.extract_stack"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">traceback.</code><code class="descname">extract_stack</code><span class="sig-paren">(</span><em>f=None</em>, <em>limit=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">从当前堆栈帧提取原始追溯。</span><span class="yiyi-st" id="yiyi-51">返回值具有与<a class="reference internal" href="#traceback.extract_tb" title="traceback.extract_tb"><code class="xref py py-func docutils literal"><span class="pre">extract_tb()</span></code></a>相同的格式。</span><span class="yiyi-st" id="yiyi-52">可选的<em>f</em>和<em>限制</em>参数与<a class="reference internal" href="#traceback.print_stack" title="traceback.print_stack"><code class="xref py py-func docutils literal"><span class="pre">print_stack()</span></code></a>具有相同的含义。</span></p></dd></dl><dl class="function"><dt id="traceback.format_list"><span class="yiyi-st" id="yiyi-53"> <code class="descclassname">traceback.</code><code class="descname">format_list</code><span class="sig-paren">(</span><em>extracted_list</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">给定由<a class="reference internal" href="#traceback.extract_tb" title="traceback.extract_tb"><code class="xref py py-func docutils literal"><span class="pre">extract_tb()</span></code></a>或<a class="reference internal" href="#traceback.extract_stack" title="traceback.extract_stack"><code class="xref py py-func docutils literal"><span class="pre">extract_stack()</span></code></a>返回的元组列表,返回一个准备打印的字符串列表。</span><span class="yiyi-st" id="yiyi-55">结果列表中的每个字符串都对应于参数列表中具有相同索引的项目。</span><span class="yiyi-st" id="yiyi-56">每个字符串以换行符结尾;则对于源文本行不是<code class="docutils literal"><span class="pre">None</span></code>的项目,字符串也可以包含内部换行符。</span></p></dd></dl><dl class="function"><dt id="traceback.format_exception_only"><span class="yiyi-st" id="yiyi-57"> <code class="descclassname">traceback.</code><code class="descname">format_exception_only</code><span class="sig-paren">(</span><em>etype</em>, <em>value</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">格式化回溯的异常部分。</span><span class="yiyi-st" id="yiyi-59">参数是例如由<code class="docutils literal"><span class="pre">sys.last_type</span></code>和<code class="docutils literal"><span class="pre">sys.last_value</span></code>给出的异常类型和值。</span><span class="yiyi-st" id="yiyi-60">返回值是一个字符串列表,每个以换行符结尾。</span><span class="yiyi-st" id="yiyi-61">通常,列表包含单个字符串;但是,对于<a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal"><span class="pre">SyntaxError</span></code></a>异常,它包含几行(打印时)显示有关语法错误发生位置的详细信息。</span><span class="yiyi-st" id="yiyi-62">指示发生哪个异常的消息是列表中的始终最后一个字符串。</span></p></dd></dl><dl class="function"><dt id="traceback.format_exception"><span class="yiyi-st" id="yiyi-63"> <code class="descclassname">traceback.</code><code class="descname">format_exception</code><span class="sig-paren">(</span><em>etype</em>, <em>value</em>, <em>tb</em>, <em>limit=None</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-64">格式化堆栈跟踪和异常信息。</span><span class="yiyi-st" id="yiyi-65">参数具有与<a class="reference internal" href="#traceback.print_exception" title="traceback.print_exception"><code class="xref py py-func docutils literal"><span class="pre">print_exception()</span></code></a>的相应参数相同的含义。</span><span class="yiyi-st" id="yiyi-66">返回值是一个字符串列表,每个以换行符结尾,而一些包含内部换行符。</span><span class="yiyi-st" id="yiyi-67">当这些行被连接和打印时,打印与<a class="reference internal" href="#traceback.print_exception" title="traceback.print_exception"><code class="xref py py-func docutils literal"><span class="pre">print_exception()</span></code></a>相同的文本。</span></p></dd></dl><dl class="function"><dt id="traceback.format_exc"><span class="yiyi-st" id="yiyi-68"> <code class="descclassname">traceback.</code><code class="descname">format_exc</code><span class="sig-paren">(</span><em>limit=None</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-69">这类似于<code class="docutils literal"><span class="pre">print_exc(limit)</span></code>但返回一个字符串,而不是打印到文件。</span></p></dd></dl><dl class="function"><dt id="traceback.format_tb"><span class="yiyi-st" id="yiyi-70"> <code class="descclassname">traceback.</code><code class="descname">format_tb</code><span class="sig-paren">(</span><em>tb</em>, <em>limit=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-71"><code class="docutils literal"><span class="pre">format_list(extract_tb(tb,</span> <span class="pre">limit))</span></code>的简写。</span></p></dd></dl><dl class="function"><dt id="traceback.format_stack"><span class="yiyi-st" id="yiyi-72"> <code class="descclassname">traceback.</code><code class="descname">format_stack</code><span class="sig-paren">(</span><em>f=None</em>, <em>limit=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-73"><code class="docutils literal"><span class="pre">format_list(extract_stack(f,</span> <span class="pre">limit))</span></code>的简写。</span></p></dd></dl><dl class="function"><dt id="traceback.clear_frames"><span class="yiyi-st" id="yiyi-74"> <code class="descclassname">traceback.</code><code class="descname">clear_frames</code><span class="sig-paren">(</span><em>tb</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-75">通过调用每个帧对象的<code class="xref py py-meth docutils literal"><span class="pre">clear()</span></code>方法,清除回溯<em>tb</em>中所有堆栈帧的局部变量。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-76"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="traceback.walk_stack"><span class="yiyi-st" id="yiyi-77"> <code class="descclassname">traceback.</code><code class="descname">walk_stack</code><span class="sig-paren">(</span><em>f</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-78">从给定帧中跟踪<code class="docutils literal"><span class="pre">f.f_back</span></code>后的堆栈,得到每个帧的帧和行号。</span><span class="yiyi-st" id="yiyi-79">如果<em>f</em>为<code class="docutils literal"><span class="pre">None</span></code>,则使用当前堆栈。</span><span class="yiyi-st" id="yiyi-80">此辅助程序与<a class="reference internal" href="#traceback.StackSummary.extract" title="traceback.StackSummary.extract"><code class="xref py py-meth docutils literal"><span class="pre">StackSummary.extract()</span></code></a>一起使用。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-81"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl><dl class="function"><dt id="traceback.walk_tb"><span class="yiyi-st" id="yiyi-82"> <code class="descclassname">traceback.</code><code class="descname">walk_tb</code><span class="sig-paren">(</span><em>tb</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">在<code class="docutils literal"><span class="pre">tb_next</span></code>之后执行回溯,得到每个帧的帧和行号。</span><span class="yiyi-st" id="yiyi-84">此辅助程序与<a class="reference internal" href="#traceback.StackSummary.extract" title="traceback.StackSummary.extract"><code class="xref py py-meth docutils literal"><span class="pre">StackSummary.extract()</span></code></a>一起使用。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-85"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-86">该模块还定义了以下类:</span></p><div class="section" id="tracebackexception-objects"><h2><span class="yiyi-st" id="yiyi-87">29.9.1. </span><span class="yiyi-st" id="yiyi-88"><a class="reference internal" href="#traceback.TracebackException" title="traceback.TracebackException"><code class="xref py py-class docutils literal"><span class="pre">TracebackException</span></code></a> Objects</span></h2><div class="versionadded"><p><span class="yiyi-st" id="yiyi-89"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-90"><a class="reference internal" href="#traceback.TracebackException" title="traceback.TracebackException"><code class="xref py py-class docutils literal"><span class="pre">TracebackException</span></code></a>对象根据实际异常创建,以捕获数据,以便稍后以轻量级方式打印。</span></p><dl class="class"><dt id="traceback.TracebackException"><span class="yiyi-st" id="yiyi-91"> <em class="property">class </em><code class="descclassname">traceback.</code><code class="descname">TracebackException</code><span class="sig-paren">(</span><em>exc_type</em>, <em>exc_value</em>, <em>exc_traceback</em>, <em>*</em>, <em>limit=None</em>, <em>lookup_lines=True</em>, <em>capture_locals=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-92">捕获异常以供以后渲染。</span><span class="yiyi-st" id="yiyi-93"><em>限制</em>,<em>lookup_lines</em>和<em>capture_locals</em>与<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>类相同。</span></p><p><span class="yiyi-st" id="yiyi-94">请注意,捕获本地时,它们也显示在追溯中。</span></p><dl class="attribute"><dt id="traceback.TracebackException.__cause__"><span class="yiyi-st" id="yiyi-95"> <code class="descname">__cause__</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">原始<code class="docutils literal"><span class="pre">__cause__</span></code>的<a class="reference internal" href="#traceback.TracebackException" title="traceback.TracebackException"><code class="xref py py-class docutils literal"><span class="pre">TracebackException</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.__context__"><span class="yiyi-st" id="yiyi-97"> <code class="descname">__context__</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-98">原始<code class="docutils literal"><span class="pre">__context__</span></code>的<a class="reference internal" href="#traceback.TracebackException" title="traceback.TracebackException"><code class="xref py py-class docutils literal"><span class="pre">TracebackException</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.__suppress_context__"><span class="yiyi-st" id="yiyi-99"> <code class="descname">__suppress_context__</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-100">原始异常的<code class="docutils literal"><span class="pre">__suppress_context__</span></code>值。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.stack"><span class="yiyi-st" id="yiyi-101"> <code class="descname">stack</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-102">表示追溯的<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.exc_type"><span class="yiyi-st" id="yiyi-103"> <code class="descname">exc_type</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-104">原始追溯的类。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.filename"><span class="yiyi-st" id="yiyi-105"> <code class="descname">filename</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-106">对于语法错误 - 发生错误的文件名。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.lineno"><span class="yiyi-st" id="yiyi-107"> <code class="descname">lineno</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-108">对于语法错误 - 发生错误的行号。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.text"><span class="yiyi-st" id="yiyi-109"> <code class="descname">text</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-110">对于语法错误 - 发生错误的文本。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.offset"><span class="yiyi-st" id="yiyi-111"> <code class="descname">offset</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-112">对于语法错误 - 发生错误的文本的偏移量。</span></p></dd></dl><dl class="attribute"><dt id="traceback.TracebackException.msg"><span class="yiyi-st" id="yiyi-113"> <code class="descname">msg</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-114">对于语法错误 - 编译器错误消息。</span></p></dd></dl><dl class="classmethod"><dt id="traceback.TracebackException.from_exception"><span class="yiyi-st" id="yiyi-115"> <em class="property">classmethod </em><code class="descname">from_exception</code><span class="sig-paren">(</span><em>exc</em>, <em>*</em>, <em>limit=None</em>, <em>lookup_lines=True</em>, <em>capture_locals=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-116">捕获异常以供以后渲染。</span><span class="yiyi-st" id="yiyi-117"><em>限制</em>,<em>lookup_lines</em>和<em>capture_locals</em>与<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>类相同。</span></p><p><span class="yiyi-st" id="yiyi-118">请注意,捕获本地时,它们也显示在追溯中。</span></p></dd></dl><dl class="method"><dt id="traceback.TracebackException.format"><span class="yiyi-st" id="yiyi-119"> <code class="descname">format</code><span class="sig-paren">(</span><em>*</em>, <em>chain=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-120">格式化异常。</span></p><p><span class="yiyi-st" id="yiyi-121">如果<em>chain</em>不是<code class="docutils literal"><span class="pre">True</span></code>,则<code class="docutils literal"><span class="pre">__cause__</span></code>和<code class="docutils literal"><span class="pre">__context__</span></code></span></p><p><span class="yiyi-st" id="yiyi-122">返回值是字符串的生成器,每个以换行符结束,一些包含内部换行符。</span><span class="yiyi-st" id="yiyi-123"><a class="reference internal" href="#traceback.print_exception" title="traceback.print_exception"><code class="xref py py-func docutils literal"><span class="pre">print_exception()</span></code></a>是这个方法的一个包装,它只是将行打印到文件中。</span></p><p><span class="yiyi-st" id="yiyi-124">指示发生哪个异常的消息始终是输出中的最后一个字符串。</span></p></dd></dl><dl class="method"><dt id="traceback.TracebackException.format_exception_only"><span class="yiyi-st" id="yiyi-125"> <code class="descname">format_exception_only</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-126">格式化回溯的异常部分。</span></p><p><span class="yiyi-st" id="yiyi-127">返回值是字符串的生成器,每个以换行符结尾。</span></p><p><span class="yiyi-st" id="yiyi-128">通常,生成器发射单个字符串;但是,对于<a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal"><span class="pre">SyntaxError</span></code></a>异常,它会发出几行(打印时)显示有关语法错误发生位置的详细信息。</span></p><p><span class="yiyi-st" id="yiyi-129">指示发生哪个异常的消息始终是输出中的最后一个字符串。</span></p></dd></dl></dd></dl></div><div class="section" id="stacksummary-objects"><h2><span class="yiyi-st" id="yiyi-130">29.9.2. </span><span class="yiyi-st" id="yiyi-131"><a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a> Objects</span></h2><div class="versionadded"><p><span class="yiyi-st" id="yiyi-132"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-133"><a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>对象表示可以进行格式化的调用堆栈。</span></p><dl class="class"><dt id="traceback.StackSummary"><span class="yiyi-st" id="yiyi-134"> <em class="property">class </em><code class="descclassname">traceback.</code><code class="descname">StackSummary</code></span></dt><dd><dl class="classmethod"><dt id="traceback.StackSummary.extract"><span class="yiyi-st" id="yiyi-135"> <em class="property">classmethod </em><code class="descname">extract</code><span class="sig-paren">(</span><em>frame_gen</em>, <em>*</em>, <em>limit=None</em>, <em>lookup_lines=True</em>, <em>capture_locals=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-136">从框架生成器构造<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>对象(例如由<a class="reference internal" href="#traceback.walk_stack" title="traceback.walk_stack"><code class="xref py py-func docutils literal"><span class="pre">walk_stack()</span></code></a>或<a class="reference internal" href="#traceback.walk_tb" title="traceback.walk_tb"><code class="xref py py-func docutils literal"><span class="pre">walk_tb()</span></code></a>返回的对象)。</span></p><p><span class="yiyi-st" id="yiyi-137">如果提供<em>limit</em>,则只有这么多帧取自<em>frame_gen</em>。</span><span class="yiyi-st" id="yiyi-138">如果<em>lookup_lines</em>是<code class="docutils literal"><span class="pre">False</span></code>,则返回的<a class="reference internal" href="#traceback.FrameSummary" title="traceback.FrameSummary"><code class="xref py py-class docutils literal"><span class="pre">FrameSummary</span></code></a>对象尚未读取其行,使创建<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a></span><span class="yiyi-st" id="yiyi-139">如果<em>capture_locals</em>是<code class="docutils literal"><span class="pre">True</span></code>,每个<a class="reference internal" href="#traceback.FrameSummary" title="traceback.FrameSummary"><code class="xref py py-class docutils literal"><span class="pre">FrameSummary</span></code></a>中的局部变量都将作为对象表示捕获。</span></p></dd></dl><dl class="classmethod"><dt id="traceback.StackSummary.from_list"><span class="yiyi-st" id="yiyi-140"> <em class="property">classmethod </em><code class="descname">from_list</code><span class="sig-paren">(</span><em>a_list</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-141">从提供的旧样式的元组列表构造一个<a class="reference internal" href="#traceback.StackSummary" title="traceback.StackSummary"><code class="xref py py-class docutils literal"><span class="pre">StackSummary</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-142">每个元组应该是以文件名,lineno,名称,行为元素的4元组。</span></p></dd></dl></dd></dl></div><div class="section" id="framesummary-objects"><h2><span class="yiyi-st" id="yiyi-143">29.9.3. </span><span class="yiyi-st" id="yiyi-144"><a class="reference internal" href="#traceback.FrameSummary" title="traceback.FrameSummary"><code class="xref py py-class docutils literal"><span class="pre">FrameSummary</span></code></a> Objects</span></h2><div class="versionadded"><p><span class="yiyi-st" id="yiyi-145"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div><p><span class="yiyi-st" id="yiyi-146"><a class="reference internal" href="#traceback.FrameSummary" title="traceback.FrameSummary"><code class="xref py py-class docutils literal"><span class="pre">FrameSummary</span></code></a>对象表示回溯中的单个帧。</span></p><dl class="class"><dt id="traceback.FrameSummary"><span class="yiyi-st" id="yiyi-147"> <em class="property">class </em><code class="descclassname">traceback.</code><code class="descname">FrameSummary</code><span class="sig-paren">(</span><em>filename</em>, <em>lineno</em>, <em>name</em>, <em>lookup_line=True</em>, <em>locals=None</em>, <em>line=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-148">表示正在格式化或打印的回溯或堆栈中的单个帧。</span><span class="yiyi-st" id="yiyi-149">它可以可选地具有包括在其中的帧本地的字符串版本。</span><span class="yiyi-st" id="yiyi-150">如果<em>lookup_line</em>为<code class="docutils literal"><span class="pre">False</span></code>,则直到<a class="reference internal" href="#traceback.FrameSummary" title="traceback.FrameSummary"><code class="xref py py-class docutils literal"><span class="pre">FrameSummary</span></code></a>访问<code class="xref py py-attr docutils literal"><span class="pre">line</span></code>属性也发生在将其转换为元组时)。</span><span class="yiyi-st" id="yiyi-151"><code class="xref py py-attr docutils literal"><span class="pre">line</span></code>可以直接提供,并且将防止线查找完全发生。</span><span class="yiyi-st" id="yiyi-152"><em>locals</em>是一个可选的局部变量字典,如果提供,变量表示存储在摘要中以供以后显示。</span></p></dd></dl></div><div class="section" id="traceback-examples"><h2><span class="yiyi-st" id="yiyi-153">29.9.4. </span><span class="yiyi-st" id="yiyi-154">Traceback Examples</span></h2><p><span class="yiyi-st" id="yiyi-155">这个简单的例子实现了一个基本的read-eval-print循环,类似于(但不如)标准的Python交互式解释器循环。</span><span class="yiyi-st" id="yiyi-156">有关解释器循环的更完整实现,请参考<a class="reference internal" href="code.html#module-code" title="code: Facilities to implement read-eval-print loops."><code class="xref py py-mod docutils literal"><span class="pre">code</span></code></a>模块。</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">traceback</span>
|
||
|
||
<span class="k">def</span> <span class="nf">run_user_code</span><span class="p">(</span><span class="n">envdir</span><span class="p">):</span>
|
||
<span class="n">source</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">">>> "</span><span class="p">)</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">exec</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">envdir</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Exception in user code:"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-"</span><span class="o">*</span><span class="mi">60</span><span class="p">)</span>
|
||
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-"</span><span class="o">*</span><span class="mi">60</span><span class="p">)</span>
|
||
|
||
<span class="n">envdir</span> <span class="o">=</span> <span class="p">{}</span>
|
||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||
<span class="n">run_user_code</span><span class="p">(</span><span class="n">envdir</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-157">以下示例演示了打印和格式化异常和跟踪的不同方法:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">traceback</span>
|
||
|
||
<span class="k">def</span> <span class="nf">lumberjack</span><span class="p">():</span>
|
||
<span class="n">bright_side_of_death</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span> <span class="nf">bright_side_of_death</span><span class="p">():</span>
|
||
<span class="k">return</span> <span class="nb">tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">lumberjack</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
|
||
<span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">exc_traceback</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** print_tb:"</span><span class="p">)</span>
|
||
<span class="n">traceback</span><span class="o">.</span><span class="n">print_tb</span><span class="p">(</span><span class="n">exc_traceback</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** print_exception:"</span><span class="p">)</span>
|
||
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">exc_traceback</span><span class="p">,</span>
|
||
<span class="n">limit</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** print_exc:"</span><span class="p">)</span>
|
||
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** format_exc, first and last line:"</span><span class="p">)</span>
|
||
<span class="n">formatted_lines</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">formatted_lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">formatted_lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** format_exception:"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span>
|
||
<span class="n">exc_traceback</span><span class="p">)))</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** extract_tb:"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">extract_tb</span><span class="p">(</span><span class="n">exc_traceback</span><span class="p">)))</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** format_tb:"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_tb</span><span class="p">(</span><span class="n">exc_traceback</span><span class="p">)))</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"*** tb_lineno:"</span><span class="p">,</span> <span class="n">exc_traceback</span><span class="o">.</span><span class="n">tb_lineno</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-158">示例的输出将类似于以下内容:</span></p><div class="highlight-none"><div class="highlight"><pre><span></span>*** print_tb:
|
||
File "<doctest...>", line 10, in <module>
|
||
lumberjack()
|
||
*** print_exception:
|
||
Traceback (most recent call last):
|
||
File "<doctest...>", line 10, in <module>
|
||
lumberjack()
|
||
File "<doctest...>", line 4, in lumberjack
|
||
bright_side_of_death()
|
||
IndexError: tuple index out of range
|
||
*** print_exc:
|
||
Traceback (most recent call last):
|
||
File "<doctest...>", line 10, in <module>
|
||
lumberjack()
|
||
File "<doctest...>", line 4, in lumberjack
|
||
bright_side_of_death()
|
||
IndexError: tuple index out of range
|
||
*** format_exc, first and last line:
|
||
Traceback (most recent call last):
|
||
IndexError: tuple index out of range
|
||
*** format_exception:
|
||
['Traceback (most recent call last):\n',
|
||
' File "<doctest...>", line 10, in <module>\n lumberjack()\n',
|
||
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
|
||
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\n',
|
||
'IndexError: tuple index out of range\n']
|
||
*** extract_tb:
|
||
[<FrameSummary file <doctest...>, line 10 in <module>>,
|
||
<FrameSummary file <doctest...>, line 4 in lumberjack>,
|
||
<FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
|
||
*** format_tb:
|
||
[' File "<doctest...>", line 10, in <module>\n lumberjack()\n',
|
||
' File "<doctest...>", line 4, in lumberjack\n bright_side_of_death()\n',
|
||
' File "<doctest...>", line 7, in bright_side_of_death\n return tuple()[0]\n']
|
||
*** tb_lineno: 10
|
||
</pre></div></div><p><span class="yiyi-st" id="yiyi-159">以下示例显示了打印和格式化堆栈的不同方法:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">traceback</span>
|
||
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">another_function</span><span class="p">():</span>
|
||
<span class="gp">... </span> <span class="n">lumberstack</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">lumberstack</span><span class="p">():</span>
|
||
<span class="gp">... </span> <span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">extract_stack</span><span class="p">()))</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_stack</span><span class="p">()))</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">another_function</span><span class="p">()</span>
|
||
<span class="go"> File "<doctest>", line 10, in <module></span>
|
||
<span class="go"> another_function()</span>
|
||
<span class="go"> File "<doctest>", line 3, in another_function</span>
|
||
<span class="go"> lumberstack()</span>
|
||
<span class="go"> File "<doctest>", line 6, in lumberstack</span>
|
||
<span class="go"> traceback.print_stack()</span>
|
||
<span class="go">[('<doctest>', 10, '<module>', 'another_function()'),</span>
|
||
<span class="go"> ('<doctest>', 3, 'another_function', 'lumberstack()'),</span>
|
||
<span class="go"> ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]</span>
|
||
<span class="go">[' File "<doctest>", line 10, in <module>\n another_function()\n',</span>
|
||
<span class="go"> ' File "<doctest>", line 3, in another_function\n lumberstack()\n',</span>
|
||
<span class="go"> ' File "<doctest>", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-160">最后一个例子演示了最后几个格式化函数:</span></p><pre><code class="language-python"><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">traceback</span>
|
||
<span class="gp">>>> </span><span class="n">traceback</span><span class="o">.</span><span class="n">format_list</span><span class="p">([(</span><span class="s1">'spam.py'</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'<module>'</span><span class="p">,</span> <span class="s1">'spam.eggs()'</span><span class="p">),</span>
|
||
<span class="gp">... </span> <span class="p">(</span><span class="s1">'eggs.py'</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="s1">'eggs'</span><span class="p">,</span> <span class="s1">'return "bacon"'</span><span class="p">)])</span>
|
||
<span class="go">[' File "spam.py", line 3, in <module>\n spam.eggs()\n',</span>
|
||
<span class="go"> ' File "eggs.py", line 42, in eggs\n return "bacon"\n']</span>
|
||
<span class="gp">>>> </span><span class="n">an_error</span> <span class="o">=</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s1">'tuple index out of range'</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">an_error</span><span class="p">),</span> <span class="n">an_error</span><span class="p">)</span>
|
||
<span class="go">['IndexError: tuple index out of range\n']</span>
|
||
</code></pre></div></div></div> |