2015-03-16 3 views
2

У меня есть программа C# (.net 4.0), основным из которых является метод вызова из внешней библиотеки FTP - dll, ссылающийся на проект. Логика находится в блоке try-catch, и catch выдает ошибку. Обработчик исключений имеет общий параметр: catch(Exception ex). IDE - VS.Необработанное исключение DivideByZero из внешней DLL - C#

Иногда библиотека 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

Похоже, исключение произошло в другом потоке .. Попробуйте обработку 'AppDomain.UnhandledException' – Blorgbeard

ответ

1

Существует аналогичная проблема, описанная here, а также here для объяснения. Как сказано в одном из комментариев, FTP-сервер должен всегда самостоятельно обрабатывать нарушения протокола без сбоев. Вы должны выбрать другой FTP, если сможете. Тем не менее, если вы хотите продолжать использовать эту DLL, вам нужно обработать исключение на уровне домена приложения, как отметил Бларборд.

Вот пример того, как поймать исключение, используя 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(); 
    } 

} 
Смежные вопросы