pytho****@googl*****
pytho****@googl*****
2011年 6月 15日 (水) 08:33:59 JST
Revision: ac60009831d1 Author: cocoatomo <cocoa****@gmail*****> Date: Tue Jun 14 16:33:01 2011 Log: c-api/exceptions.rst translation completed http://code.google.com/p/python-doc-ja/source/detail?r=ac60009831d1 Modified: /c-api/exceptions.rst ======================================= --- /c-api/exceptions.rst Wed Apr 20 03:07:25 2011 +++ /c-api/exceptions.rst Tue Jun 14 16:33:01 2011 @@ -7,9 +7,9 @@ 例外処理 ******** -この章で説明する関数を使うと、Pythonの例外の処理や送出ができるようになりま す。Pythonの例外処理の基本をいくらか理解することが大切です。 -例外はUnix :c:data:`errno` 変数にやや似た機能を果たします: 発生した -中で最も新しいエラーの(スレッド毎の)グローバルなインジケータがあります。実 行に成功した場合にはほとんどの関数がこれをクリアしませんが、失敗したときには +この章で説明する関数を使うと、 Python の例外の処理や送出ができるようになり ます。 Python の例外処理の基本をいくらか理解することが大切です。 +例外は Unix :c:data:`errno` 変数にやや似た機能を果たします: 発生した +中で最も新しいエラーの (スレッド毎の) グローバルなインジケータがあります。 実行に成功した場合にはほとんどの関数がこれをクリアしませんが、失敗したときに は エラーの原因を示すために設定します。ほとんどの関数はエラーインジケータも返 し、通常は関数がポインタを返すことになっている場合は *NULL* であり、 関数が整数を返す場合は ``-1`` です。(例外: :c:func:`PyArg_\*` 関数は 実行に成功したときに ``1`` を返し、失敗したときに ``0`` を返します). @@ -75,9 +75,9 @@ (と再帰的にサブタプル内)のすべての例外が一致するか調べられます。 -.. c:function:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb) - - ある状況では、以下の :c:func:`PyErr_Fetch` が返す値は "正規化されていな い"可能性があります。つまり、 ``*exc`` は +.. c:function:: void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) + + ある状況では、以下の :c:func:`PyErr_Fetch` が返す値は "正規化されていな い" 可能性があります。つまり、 ``*exc`` は クラスオブジェクトだが ``*val`` は同じクラスのインスタンスではないという 意味です。この関数はそのような場合にそのクラスをインスタンス化 するために使われます。その値がすでに正規化されている場合は何も起きませ ん。遅延正規化はパフォーマンスを改善するために実装されています。 @@ -253,7 +253,7 @@ .. c:function:: void PyErr_BadInternalCall() - ``PyErr_SetString(PyExc_TypeError, message)`` を省略したものです。 + ``PyErr_SetString(PyExc_SystemError, message)`` を省略したものです。 ここで *message* は内部操作(例えば、Python/C API関数)が不正な引数と ともに呼び出されたということを示しています。主に内部で使用するためのもの です。 @@ -372,6 +372,37 @@ 関数が呼び出されます。 *obj* のreprが警告メッセージにプリントされるでし ょう。 + +再帰の管理 +========== + +これら2つの関数は C レベルの再帰呼び出しを安全に実行する方法を、コアモジ ュールにも拡張モジュールにも提供します。 +再帰を使ったコードが必ずしも Python コードを実行するわけではない場合 (Python コードは再帰の深さを自動的に追跡します)、これらの関数が必要となりま す。 + +.. c:function:: int Py_EnterRecursiveCall(char *where) + + C レベルの再帰呼び出しをしようとしているところに印を付けます。 + + :const:`USE_STACKCHECK` が定義されている場合、 OS のスタックがオーバーフ ローがしたかどうかを :c:func:`PyOS_CheckStack` を使ってチェックします。 + もしオーバーフローしているなら、 :exc:`MemoryError` をセットしゼロでない 値を返します。 + + 次にこの関数は再帰の上限に達していないかをチェックします。 + 上限に達している場合、 :exc:`RuntimeError` をセットしゼロでない値を返し ます。 + そうでない場合はゼロを返します。 + + 再帰の深さの上限に達して送出される :exc:`RuntimeError` のメッセージに連 結できるよう + *where* は ``" in instance check"`` のような文字列にしてください。 + +.. c:function:: void Py_LeaveRecursiveCall() + + :c:func:`Py_EnterRecursiveCall` を終了させます。 + :c:func:`Py_EnterRecursiveCall` の *成功した* 呼び出しに対して必ず 1 回 呼び出さなければなりません。 + +.. memo + + エラーメッセージは訳していない. + + .. _standardexceptions: 標準例外