如何使用 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() 进行良好的错误处理?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]