blob: 310b60b6c3bd9a70170edc23f346fa97b665407e [file] [log] [blame]
<html lang="en">
<head>
<title>Exception Handling - Debugging with GDB</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Debugging with GDB">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Python-API.html#Python-API" title="Python API">
<link rel="prev" href="Basic-Python.html#Basic-Python" title="Basic Python">
<link rel="next" href="Values-From-Inferior.html#Values-From-Inferior" title="Values From Inferior">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software'' and ``Free Software Needs
Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
and with the Back-Cover Texts as in (a) below.
(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
this GNU Manual. Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Exception-Handling"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Values-From-Inferior.html#Values-From-Inferior">Values From Inferior</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Basic-Python.html#Basic-Python">Basic Python</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Python-API.html#Python-API">Python API</a>
<hr>
</div>
<h5 class="subsubsection">23.2.2.2 Exception Handling</h5>
<p><a name="index-python-exceptions-1606"></a><a name="index-exceptions_002c-python-1607"></a>
When executing the <code>python</code> command, Python exceptions
uncaught within the Python code are translated to calls to
<span class="sc">gdb</span> error-reporting mechanism. If the command that called
<code>python</code> does not handle the error, <span class="sc">gdb</span> will
terminate it and print an error message containing the Python
exception name, the associated value, and the Python call stack
backtrace at the point where the exception was raised. Example:
<pre class="smallexample"> (gdb) python print foo
Traceback (most recent call last):
File "&lt;string&gt;", line 1, in &lt;module&gt;
NameError: name 'foo' is not defined
</pre>
<p><span class="sc">gdb</span> errors that happen in <span class="sc">gdb</span> commands invoked by Python
code are converted to Python <code>RuntimeError</code> exceptions. User
interrupt (via <kbd>C-c</kbd> or by typing <kbd>q</kbd> at a pagination
prompt) is translated to a Python <code>KeyboardInterrupt</code>
exception. If you catch these exceptions in your Python code, your
exception handler will see <code>RuntimeError</code> or
<code>KeyboardInterrupt</code> as the exception type, the <span class="sc">gdb</span> error
message as its value, and the Python call stack backtrace at the
Python statement closest to where the <span class="sc">gdb</span> error occured as the
traceback.
<p><a name="index-gdb_002eGdbError-1608"></a>When implementing <span class="sc">gdb</span> commands in Python via <code>gdb.Command</code>,
it is useful to be able to throw an exception that doesn't cause a
traceback to be printed. For example, the user may have invoked the
command incorrectly. Use the <code>gdb.GdbError</code> exception
to handle this case. Example:
<pre class="smallexample"> (gdb) python
&gt;class HelloWorld (gdb.Command):
&gt; """Greet the whole world."""
&gt; def __init__ (self):
&gt; super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_OBSCURE)
&gt; def invoke (self, args, from_tty):
&gt; argv = gdb.string_to_argv (args)
&gt; if len (argv) != 0:
&gt; raise gdb.GdbError ("hello-world takes no arguments")
&gt; print "Hello, World!"
&gt;HelloWorld ()
&gt;end
(gdb) hello-world 42
hello-world takes no arguments
</pre>
</body></html>