如何将一个项目中抛出的异常返回给另一个项目
本文关键字:项目 异常 返回 另一个 一个 | 更新日期: 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之类的事情,在那里你可以在两个项目之间共享对象。