异常处理 (RPC)
RPC 使用与 Windows API 相同的异常处理方法。
RpcTryFinally / RpcFinally / RpcEndFinally 结构等效于 Windows try-finally 语句。 RPC 异常构造 RpcTryExcept / RpcExcept / RpcEndExcept 等效于 Windows try-except 语句。
使用 RPC 异常处理程序时,客户端源代码是可移植的。 为每个平台提供的不同 RPC 头文件解析每个平台的 RpcTry 和 RpcExcept 宏。 在 Windows 环境中,这些宏直接映射到 Windows try-finally 和 try-except 语句。 在其他环境中,这些宏映射到异常处理程序的其他特定于平台的实现。
这些结构引发的潜在异常包括 RPC 函数返回的错误代码集,其前缀RPC_S_和RPC_X,以及 Windows 返回的异常集。 有关详细信息,请参阅 RPC 返回值。
虽然 RpcTry 和 RpcExcept 宏提供了一种可自定义的平台不可知的方式来处理异常,但在 Windows Vista 和更高版本的 Windows 中, RpcExceptionFilter 是处理异常的建议方法。 它不需要编写自定义筛选器来捕获许多最常见的结构化异常;但是,自定义异常筛选器仍然需要 RpcExcept。
在传输层) 上方的服务器应用程序、服务器存根和服务器运行时库 (中发生的异常将传播到客户端。 不会从服务器传输级别传播任何异常。 服务器例程将错误返回到 RPC 运行时的建议方法是引发异常。 服务器例程可以使用适合在服务器例程之间传达错误的任何方法,但如果遇到阻止其执行远程过程的错误,则应在清理后和返回到 RPC 运行时之前引发异常,而不是将只有服务器例程识别为错误的值返回到 RPC。
下图显示了如何将异常从服务器返回到客户端。
RPC 异常处理程序与 Open Software Foundation-Distributed Computing Environment (OSF-DCE) 异常处理宏 TRY、 FINALLY 和 CATCH 略有不同。 各种供应商提供将 OSF-DCE RPC 函数映射到 Microsoft RPC 函数(包括 TRY、 CATCH、 CATCH_ALL 和 ENDTRY)的 include 文件。 这些头文件还会将 RPC_S_* 错误代码映射到 OSF-DCE 异常对应项,rpc_s_*,并将 RPC_X_* 错误代码映射到 rpc_x_*。 对于 OSF-DCE 可移植性,请使用包含文件。 有关 RPC 异常处理程序的详细信息,请参阅 RpcExceptionFilter、 RpcExcept、 RpcFinally。 有关 Windows 异常处理程序的详细信息,请参阅 结构化异常处理。