如何将一个项目中抛出的异常返回给另一个项目

本文关键字:项目 异常 返回 另一个 一个 | 更新日期: 2023-09-27 18:03:14

是否有任何方法可以捕获并返回从一个项目抛出的异常到另一个?

例如,我在不同的项目中保留代码。假设A和B,如果A是引擎部分,B是UI部分,那么引擎中发生的异常也应该被UI捕获。请帮助。

如何将一个项目中抛出的异常返回给另一个项目

想要在引擎代码中捕获异常的唯一原因是如果您认为可以处理它,或者需要做一些日志记录或类似的事情。仅仅为了重新投掷而捕捉并没有太多(任何)好处。然而,假设你有一个合理的理由,那么在你的UI代码中你可以有

try
{
    engine.Start();
}
catch (SpecificException se)
{
    // Do stuff with specific exception
}
catch (Exception ex)
{
    // Show the user something unexpected happened 
}

在你的Engine代码中,你可以有;

public void Start()
{
    try
    {
        if (this.HasNoOil)
        {
            throw new SpecificException("Can't go without oil. We'll do some damage");
        } 
        // Other stuff
    }
    catch (Exception ex)
    {
        // Log details of exception and throw it up the stack
        throw;
    }
}

如果你想在UI级别捕获异常,你就不能在引擎级别捕获它们。

对于正在运行的应用程序,抛出异常的程序集(每个项目都创建一个程序集)没有区别。

如果您确实需要在引擎级别捕获并重新抛出异常,请正确地重新抛出

catch(Exception ex) 
{ 
    // whatever logic
    throw;
}

或者换行

catch(Exception ex) 
{ 
    // whatever logic
    throw new YourEngineException("Some Message", ex);
}   

如果你只是想记录它,不要这样做,如果它不跨越进程边界。

Catch, log, re-throw在我看来是一个反模式。它只是创建了无数个日志条目,如果不破坏堆栈跟踪,在尽可能高的级别捕获应该就足够了。

如果可以向异常提供额外信息,则使用包装。例如,如果你有一个方法加载数据,修改并保存它,你可以包装异常并添加"保存时错误'{0}'"或其他东西。但是,不要忘记将原始异常包含在内部异常中。

在我看来这是不可能的,除非这两个应用程序共享相同的应用程序域。要使它们成为单个应用程序域的一部分,你需要做远程或wcF之类的事情,在那里你可以在两个项目之间共享对象。