如何使用 RpcRaiseException() 进行良好的错误处理?

Posted

技术标签:

【中文标题】如何使用 RpcRaiseException() 进行良好的错误处理?【英文标题】:How do I use RpcRaiseException() for good error handling? 【发布时间】:2009-11-26 14:41:00 【问题描述】:

MS RPC 运行时中有RpcRaiseException() 函数,用于指示在服务器端的 RPC 调用或客户端的管道回调中发生的错误。传入RpcRaiseError() 的 RPC_STATUS 被传播到 RPC 调用的站点。

问题是如何选择 RPC_STATUS 值?

在管道pull() 回调中说,我从IStream* 读取数据并将该数据输入管道。现在IStream::Read() 返回一个HRESULT 表示错误,我需要调用RpcRaiseException() 来中断调用。

我传递了什么值?

【问题讨论】:

只通过你得到的 HRESULT 有什么问题?当然胜过 RPC_E_SERVERFAULT。 只有一件事——我不确定它是否会在客户端产生有意义的消息。 【参考方案1】:

如果您有一个可能失败的 API,为什么不让 API 返回失败代码作为 API 的返回值?

如果您确实想使用 RpcRaiseException,异常将作为异常传播到客户端,因此异常代码将在客户端的 RpcExcept 处理程序中显示为 RpcExceptionCode。

【讨论】:

你的意思是我只是将 HRESULT 值传递给 RpcRaiseError()。否则我无法表明管道回调中出了问题。 不,您将 API 定义为返回 HRESULT。然后你只需从服务器返回错误代码。 sharptooth:请注意,为了清楚起见,我编辑了我的答案并纠正了不正确的假设。 我明白了。但是如果不发明一个巨大的***,我就无法在回调中做这样的事情。 sharptooth - 当您只是将 Win32 错误代码作为异常引发时会发生什么?执行回调的 RPC 服务器应该使用 RpcTryExcept/RpcExcept 处理程序包装回调,以防止暂时的 RPC 失败。

以上是关于如何使用 RpcRaiseException() 进行良好的错误处理?的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?