我有一个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()
答案 0 :(得分:1)
有一个类似的问题描述here和here进行解释。正如其中一条评论所述,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();
}
}