我正在编写一个在另一台服务器上调用异步方法的同步方法。服务器的方法在完成后调用回调,并且在出错的情况下,其中一个回调的参数包含异常。我想从我的方法抛出一个异常,服务器的异常作为InnerException。但是,为了捕获异常,我必须将其打包,似乎应该有一个更简单的方法。我应该更简单地做些什么?
我的代码是这样的:
private class BoxedException
{
public Exception Exception;
}
public bool MyMethod()
{
EventWaitHandle waitHandle = new new EventWaitHandle(false, EventResetMode.ManualReset);
BoxedException boxedException = new BoxedException();
bool called = theServer.ServerMethod(getCallback(waitHandle, boxedException));
if (called)
{
waitHandle.WaitOne();
if (boxedException.Exception != null)
throw new Exception("ServerMethod failed", boxedException.Exception);
}
}
private ServerCallback getCallback(EventWaitHandle waitHandle, BoxedException be)
{
return (object sender, ServerArgs e) =>
{
handleServerArgs(e, be);
waitHandle.Set();
};
}
private void handleServerArgs(ServerArgs e, BoxedException be)
{
if (e.Exception != null)
{
be.Exception = e.Exception;
}
else
{
// do stuff...
}
}
答案 0 :(得分:2)
从外部进程传回一个盒装异常没有任何本质上的错误,特别是如果你有嵌套的内部异常或需要堆栈跟踪。如果您只对异常消息感兴趣,那么您可以通过将它们连接成一个字符串并仅将其传递回去。
答案 1 :(得分:1)
通过将lambda放在自己的方法中,你对自己有点困难。如果你内联写它会变得容易多了。像这样:
var waitHandle = new ManualResetEvent(false);
Exception fault = null;
bool called = theServer.ServerMethod((obj, se) => {
if (se.Exception != null) fault = se.Exception;
else ProcessServerResponse(se);
waitHandle.Set();
});
if (called) {
waitHandle.WaitOne();
if (fault != null) kaboom(fault);
}