Windows 用の Python 2.7.5 アプリを拡張しています。アプリはSetUnhandledExceptionFilter
、未処理の C 例外が発生したときに呼び出される Python 関数をインストールするために使用します。
@ctypes.WINFUNCTYPE(ctypes.wintypes.LONG, PEXCEPTION_POINTERS)
def crashHandler(exceptionInfo):
# Some code that deals with the unhandled C exception...
...
windll.kernel32.SetUnhandledExceptionFilter(crashHandler)
PEXCEPTION_POINTERS
(この質問の目的には関係ないと思うので、以下のコードを示します。)
元の形式でcrashHandler
は、ログを記録してプロセスをシャットダウンします。crashHandler
未処理の例外を数回処理することを確認したので、UnhandledExceptionFilter として正しくインストールされていると確信しています。
いくつかの変更を加えたのでcrashHandler
、テストしたいと思います。これを行うには、プログラムで C の例外を発生させ、それを で処理するというのが私の考えcrashHandler
です。私は次のことを試しました:
>>> windll.kernel32.RaiseException(5, 0, 0, None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 5] Access is denied
>>> windll.kernel32.RaiseException(6, 0, 0, None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: [Error 6] The handle is invalid
そのため、例外はすぐに Python インタープリターによってキャッチされるため、 my に伝播されませんcrashHandler
。
a) Python の例外処理を無効にするか、b) Python の例外処理メカニズムによってキャッチされず、my.xml に伝播される C 例外をプログラムで発生させるにはどうすればよいcrashHandler
ですか?
のコードは次のPEXCEPTION_POINTERS
とおりです。
from ctypes import Structure
import ctypes
EXCEPTION_MAXIMUM_PARAMETERS = 15
class EXCEPTION_RECORD(Structure):
pass
PEXCEPTION_RECORD = ctypes.wintypes.POINTER(EXCEPTION_RECORD)
EXCEPTION_RECORD._fields_ = [
('ExceptionCode', ctypes.wintypes.DWORD),
('ExceptionFlags', ctypes.wintypes.DWORD),
('ExceptionRecord', PEXCEPTION_RECORD),
('ExceptionAddress', ctypes.wintypes.LPVOID),
('NumberParameters', ctypes.wintypes.DWORD),
('ExceptionInformation', ctypes.wintypes.LPVOID * EXCEPTION_MAXIMUM_PARAMETERS),
]
class EXCEPTION_POINTERS(Structure):
_fields_ = [('ExceptionRecord', PEXCEPTION_RECORD),
('ContextRecord', ctypes.wintypes.LPVOID)]
PEXCEPTION_POINTERS = ctypes.wintypes.POINTER(EXCEPTION_POINTERS)