14 Customization Features
在许多情况下,需要更改接口中特定声明的默认包装。例如,您可能希望提供用于捕获c++异常的钩子、添加断言或向底层代码生成器提供提示。本章描述了其中的一些自定义技术。首先,讨论异常处理。然后,描述了一种更通用的定制机制,称为“特性”。
14.1 Exception handling with %exception
%exception指令允许你定义一个通用的异常处理程序。例如,可以指定如下参数:
%exception { try { $action } catch (RangeError) { ... handle error ... } }
如何处理异常取决于目标语言,例如Python:
%exception { try { $action } catch (RangeError) { PyErr_SetString(PyExc_IndexError, "index out-of-bounds"); SWIG_fail; } }
在定义之后,用大括号括起来的代码将直接插入低级包装器函数中。特殊变量$action是少数支持的%exception特殊变量之一,它将被要执行的实际操作(函数调用、方法调用、属性访问等)所替代。异常处理程序在显式删除之前一直有效。这可以通过使用%exception或%noexception来完成,不需要任何代码。例如:
%exception; // Deletes any previously defined handler
兼容性注意:以前版本的SWIG使用了一个特殊指令%except,用于异常处理。该指令已被弃用——%exception提供了相同的功能,但实际上更加灵活。
14.1.1 Handling exceptions in C code