【问题标题】:Exception caused by AppDomain when it shouldn't?AppDomain 不应该导致的异常?
【发布时间】:2009-11-10 19:21:32
【问题描述】:

我正在研究我的 MCTS,目前正在研究 AppDomain 功能。但我遇到了一些不清楚的事情。 AppDomain 应该捕获 Exception 并允许域安全卸载。 (除了其他地方建议的StackOverflowException 可能例外)

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, setup);

当我决定在为此目的创建的程序集中创建示例类的实例时,我应该获得一个安全的受限域,它将捕获发生的错误并可以安全地卸载。至少我从我的学习书中是这样理解的。

var type = (IDoSomeWork) domain.CreateInstanceAndUnwrap("Library1", "Library1.Class1");
type.Run();

这会在type.Run() 上引发异常(因为我是这样做的)。但是AppDomain 不应该安全地捕获它吗?这不就是我们有AppDomain的原因吗?

更新:

根据要求,我已经包含了Library1.Class1 的定义。此外,为清楚起见,UnhandledExceptionEventHandler 对捕获异常没有影响,并且与问题无关。

[Serializable]
public class Class1 : MarshalByRefObject, IDoSomeWork
{
    public void Run()
    {
        Debug.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        throw new ApplicationException(String.Format("{0}", this.ToString()));
    }
}

我已验证它在MyDomain 中运行。

【问题讨论】:

  • 请给出Library1.Class1的定义。

标签: c# .net appdomain


【解决方案1】:

UnhandledException 事件并没有捕获传统意义上的异常,就像一个 try-catch 块(据我所知),它只是一个信息点,让您可以执行日志记录等任务。

引用自MSDN documentation

此事件提供通知 未捕获的异常。它允许 应用程序记录有关信息 系统前的异常 默认处理程序报告异常 给用户并终止 应用。

所以异常仍然会冒泡到系统默认异常处理程序。

【讨论】:

  • 为什么异常不会保留在 ApplicationDomain 中?我不确定这是否完全回答了这个问题。
  • @Taylor:因为该活动的设计初衷并非如此。文档明确指出,事件处理程序允许应用程序收集信息在系统默认处理程序向用户报告异常并终止应用程序之前。事件的目的不是作为全局捕获块。
  • 我认为问题的重点是为什么默认的 AppDomain 会出现异常。例如,如果自定义(非默认)域没有 UnhandledExceptionEventHandler 会发生什么?
  • @Taylor:重新阅读问题和我的答案我看到你的困惑,必须说我开始分享它。我暂时先给出答案(其他任务时间不足),但稍后会在进行一些实验后回来,除非在那之前其他人已经对这个问题有所了解。
  • 我最近问了一个关于 AppDomains 的问题,似乎也有一些与这个话题相关的分歧(cmets on Reed Copsey's answer)。见这里stackoverflow.com/questions/1639244/…
【解决方案2】:
 AddHandler Application.ThreadException, AddressOf MyExceptionHandler.HandleException

添加一个顶级异常处理程序,但在这种情况下它可能无法执行您想要的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多