来自外部DLL的未处理的DivideByZero异常 - C#

时间:2015-03-16 22:15:46

标签: c# .net exception dll exception-handling

我有一个C#(。net 4.0)程序,主要是从外部FTP库调用方法 - 项目引用的dll。逻辑位于try-catch块中,catch会打印错误。异常处理程序具有通用参数:catch(Exception ex)。 IDE是VS。

有时,FTP库会抛出以下除以零的异常。问题是它在catch块中被捕获,并且程序崩溃了。 我的包装器代码中出现的异常被捕获。任何人都知道差异是什么以及如何捕获异常?

例外:

Description: The process was terminated due to an unhandled exception.
Exception Info: System.DivideByZeroException
Stack:
   at ComponentPro.IO.FileSystem+c_OU.c_F2B()
   at System.Threading.ExecutionContext.runTryCode(System.Object)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

1 个答案:

答案 0 :(得分:1)

有一个类似的问题描述herehere进行解释。正如其中一条评论所述,FTP服务器应该始终处理协议违规而不会崩溃。如果可以的话,你应该选择另一个FTP。但是,如果您想继续使用该DLL,则需要在App Domain级别处理异常,正如Blorgbeard指出的那样。

以下是使用AppDomain.UnhandledException事件捕获异常的示例:

using System;
using System.Security.Permissions;

public class Test
{

   [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
   public static void Example()
   {
       AppDomain currentDomain = AppDomain.CurrentDomain;
       currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

       try
       {
          throw new Exception("1");
       }
       catch (Exception e)
      {
         Console.WriteLine("Catch clause caught : " + e.Message);
      }

      throw new Exception("2");

      // Output: 
      //   Catch clause caught : 1 
      //   MyHandler caught : 2
   }

  static void MyHandler(object sender, UnhandledExceptionEventArgs args)
  { 
     Exception e = (Exception)args.ExceptionObject;
     Console.WriteLine("MyHandler caught : " + e.Message);
  }

  public static void Main()
  {
     Example();
  }

}