【问题标题】:Handle unhandled exceptions only from certain assemblies仅处理来自某些程序集的未处理异常
【发布时间】:2011-12-10 23:03:24
【问题描述】:

好吧,这可能是一个奇怪的问题,但我将如何处理仅来自应用程序中某些程序集的未处理异常,但包括源自 .NET 本身的异常,例如当您收到源自 .NET 的 ADO.NET 异常时。 NET 程序集。

我之所以需要这个,是因为在使用遗留应用程序时,我只需要对由多个程序集组成的模块进行未处理的异常处理,并且所有内容最终都在同一个应用程序中,作为同一进程的一部分。

我可以在程序集级别而不是在全局应用程序级别捕获异常吗?

【问题讨论】:

  • 丹尼斯,出于好奇:以下任何答案对您有帮助吗?您还在等待灵丹妙药吗?

标签: c# .net winforms exception


【解决方案1】:

如果您不应该处理异常,只需检查堆栈跟踪并使用throw;

try
{
    //something
}
catch (Exception err)
{
    if (!err.StackTrace.Contains("YourAssemblyName"))
        throw;
}

【讨论】:

  • 是的,我也想过这个,但是stacktrace也包含文件夹名称,如果某些文件夹与程序集命名相同怎么办
  • 包括一个空格,如" YourAssemblyName"
  • 很抱歉,您能解释一下在这种情况下空格有什么帮助吗?
  • 因为文件夹不会以空格开头,并且所有堆栈跟踪项都以“at assembly.namespace”开头,但“at”可能会因不同的操作系统语言而改变
【解决方案2】:

不,但您可以在 AppDomain 级别捕获。如果修改与您的应用程序相关,请尝试:

编辑:

        AppDomain otherAppDomain = AppDomain.CreateDomain("myDomain");
        otherAppDomain.UnhandledException += new UnhandledExceptionEventHandler(otherAppDomain_UnhandledException);
        Assembly assembly = otherAppDomain.Load("TheAssemblyThatThrows");
        // But you might need to have MyClass inherit from MarshalByRefObject
        MyClass instance = (MyClass)otherAppDomain.CreateInstanceAndUnwrap("TheAssemblyThatThrows", "MyClass");
        instance.DoSomething();

【讨论】:

    【解决方案3】:

    当然我不知道要隔离的程序集的调用次数,所以我不知道这是否可行,但在我看来,围绕你正在谈论的模块创建一个外观是合适的。

    外观将捕获从这些特定程序集引发的异常,并可以重新引发自定义异常,原始异常为InnerException。自定义异常很容易被全局异常处理程序识别。

    【讨论】:

      【解决方案4】:

      您可以从头开始编写一个,但http://code.google.com/p/elmah/ 是处理未处理异常的绝佳框架!

      然后您可以使用 http://code.google.com/p/elmah/wiki/ErrorFiltering 使用反射过滤每个程序集。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 2011-04-07
        • 1970-01-01
        • 2011-01-29
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        相关资源
        最近更新 更多