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

时间:2011-07-21 07:33:40

标签: c# asp.net exception-handling

有没有办法捕获并返回从一个项目抛出到另一个项目的异常?

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

3 个答案:

答案 0 :(得分:3)

你想要在引擎代码中捕获异常的唯一原因是你认为你可以处理它,或者你需要做一些日志记录或类似的东西。简单地重新抛出没有太多(任何)好处。但是,假设您有正当理由,那么您可以在UI代码中使用

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

在您的引擎代码中,您可以拥有;

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;
    }
}

答案 1 :(得分:2)

如果您想在UI级别捕获异常,则无法在引擎级别捕获它们。

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

如果你真的必须在引擎级别捕获并重新抛出异常,请重新正确地重新抛出

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

或包装

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

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

在我看来,抓住,记录,重新投掷是一种反模式。它只会创建一个bazillion日志条目,如果你不破坏堆栈跟踪,捕获尽可能高的级别就足够了。

如果您可以向异常提供额外信息,请使用换行。例如,如果您有一个加载数据的方法,更改并保存它,您可以包装异常并在保存时添加“错误”{0}“或其他内容。但是,不要忘记将原始异常包含在内部异常中。

答案 2 :(得分:0)

在我看来,这是不可能的,除非这两个应用程序共享相同的App域。要使它们成为单个应用程序域的一部分,您需要进行远程处理或wcF类型的东西,您可以在两个项目之间共享对象。