代码之家  ›  专栏  ›  技术社区  ›  Simon

我应该如何处理在异步方法中抛出的异常,这些异步方法是我创建的。(或者,这是一种代码味道吗?)

  •  0
  • Simon  · 技术社区  · 16 年前

    我正在编写一个在另一台服务器上调用异步方法的同步方法。服务器的方法完成后调用回调,如果出现错误,回调的参数之一包含异常。我想从方法中抛出一个异常,将服务器的异常作为其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...
        }
    }
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Ed Power    16 年前

    从外部进程返回装箱的异常并没有本质上的错误,特别是当您有嵌套的内部异常或需要堆栈跟踪时。如果您只对异常消息感兴趣,可以简单地将它们连接成一个字符串,然后将其传回。

        2
  •  1
  •   Hans Passant    16 年前

    你把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);
            }