python - 在 Python 中引发未处理的 C 异常

标签 python c windows exception

我正在为 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 解释器捕获,因此不会传播到我的 crashHandler

我如何才能 a) 禁用 Python 的异常处理或 b) 以编程方式引发未被 Python 的异常处理机制捕获并传播到我的 crashHandler 的 C 异常?


这是 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)

最佳答案

windll模块自动捕获调用中出现的windows SEH异常,并将其转换为WindowsError python异常。因此它们不是未处理的异常。

您需要使用没有这么好的包装器的 API。

最好的办法是使用 C 扩展模块,它会通过取消引用随机指针(或空指针)来导致访问冲突。

关于python - 在 Python 中引发未处理的 C 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154217/

相关文章:

c++ - 当内存限制接近时转储缓冲数据

python - 从字典列表创建一个新字典

python - 计算多个词典之间的相似度 "score"

python - 如何从对象中获取函数定义?

c - 如何在 C 中调用带有 "int"参数的函数?

c - shell c 中的输入输出重定向

c - DDA 算法并未为所有坐标值绘制直线

python - TensorFlow CNN 教程 : How to edit top layer to be locally connected?

windows - 批处理 - If 语句导致错误

windows - 适用于 Windows 的 CouchDB - SSL 证书 - 连接错误