有没有办法捕获并返回从一个项目抛出到另一个项目的异常?
例如,我将代码保存在不同的项目中。说A和B.如果A是引擎部分而B是UI部分,那么引擎中发生的异常也应该在UI中捕获。请帮助。
答案 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类型的东西,您可以在两个项目之间共享对象。