uTools-Manuals/docs/python/traceback.html
2019-04-21 11:50:48 +08:00

112 lines
45 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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&gt; <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 &gt;</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_exceptionsys.last_type</span> <span class="pre">sys.last_value</span> <span class="pre">sys.last_traceback</span> <span class="pre">t4&gt; <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&gt;),表示通常为堆栈跟踪打印的信息。</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_listextract_tbtb</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_listextract_stackf</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">"&gt;&gt;&gt; "</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 "&lt;doctest...&gt;", line 10, in &lt;module&gt;
lumberjack()
*** print_exception:
Traceback (most recent call last):
File "&lt;doctest...&gt;", line 10, in &lt;module&gt;
lumberjack()
File "&lt;doctest...&gt;", line 4, in lumberjack
bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
File "&lt;doctest...&gt;", line 10, in &lt;module&gt;
lumberjack()
File "&lt;doctest...&gt;", 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 "&lt;doctest...&gt;", line 10, in &lt;module&gt;\n lumberjack()\n',
' File "&lt;doctest...&gt;", line 4, in lumberjack\n bright_side_of_death()\n',
' File "&lt;doctest...&gt;", line 7, in bright_side_of_death\n return tuple()[0]\n',
'IndexError: tuple index out of range\n']
*** extract_tb:
[&lt;FrameSummary file &lt;doctest...&gt;, line 10 in &lt;module&gt;&gt;,
&lt;FrameSummary file &lt;doctest...&gt;, line 4 in lumberjack&gt;,
&lt;FrameSummary file &lt;doctest...&gt;, line 7 in bright_side_of_death&gt;]
*** format_tb:
[' File "&lt;doctest...&gt;", line 10, in &lt;module&gt;\n lumberjack()\n',
' File "&lt;doctest...&gt;", line 4, in lumberjack\n bright_side_of_death()\n',
' File "&lt;doctest...&gt;", 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">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">traceback</span>
<span class="gp">&gt;&gt;&gt; </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">&gt;&gt;&gt; </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">&gt;&gt;&gt; </span><span class="n">another_function</span><span class="p">()</span>
<span class="go"> File "&lt;doctest&gt;", line 10, in &lt;module&gt;</span>
<span class="go"> another_function()</span>
<span class="go"> File "&lt;doctest&gt;", line 3, in another_function</span>
<span class="go"> lumberstack()</span>
<span class="go"> File "&lt;doctest&gt;", line 6, in lumberstack</span>
<span class="go"> traceback.print_stack()</span>
<span class="go">[('&lt;doctest&gt;', 10, '&lt;module&gt;', 'another_function()'),</span>
<span class="go"> ('&lt;doctest&gt;', 3, 'another_function', 'lumberstack()'),</span>
<span class="go"> ('&lt;doctest&gt;', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]</span>
<span class="go">[' File "&lt;doctest&gt;", line 10, in &lt;module&gt;\n another_function()\n',</span>
<span class="go"> ' File "&lt;doctest&gt;", line 3, in another_function\n lumberstack()\n',</span>
<span class="go"> ' File "&lt;doctest&gt;", 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">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">traceback</span>
<span class="gp">&gt;&gt;&gt; </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">'&lt;module&gt;'</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 &lt;module&gt;\n spam.eggs()\n',</span>
<span class="go"> ' File "eggs.py", line 42, in eggs\n return "bacon"\n']</span>
<span class="gp">&gt;&gt;&gt; </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">&gt;&gt;&gt; </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>