7

Ho sviluppato un progetto che utilizza una DLL esterna come FTPServer, ho creato il server FTP sul mio progetto come questo:Come posso gestire l'eccezione che gira su una dll esterna?

private ClsFTPServer _ClsFTPServer;
_ClsFTPServer = new ClsFTPServer(FTPUserName, FTPPassword, FTPPath);

Il codice precedente crea un'istanza della classe server FTP, inizia la classe il server FTP sul suo costruttore, funziona in modo indipendente come un modulo mentre i client inviano la loro richiesta correttamente, ma quando arriva una richiesta errata al server FTP genera un'eccezione e causa l'arresto anomalo dell'applicazione.

Come posso gestire l'eccezione generata dalla DLL esterna per impedire l'arresto anomalo dell'applicazione?

+0

la DLL esterna non dovrebbe realmente essere gettando eccezioni da thread diversi dal thread chiamante, avete la possibilità di modificare la codice dll? Un modo migliore per gestire gli errori sarebbe che la dll attivi un evento quando si verifica un errore e iscriversi a quell'evento nel tuo programma principale (che sta consumando la dll) – RobJohnson

+1

tenta di rilevare appDomain/threading exceptions nell'applicazione- http: // msdn.microsoft.com/en-GB/library/system.appdomain.unhandledexception.aspx (risposta aggiunta con collegamento a maggiori informazioni) – NDJ

+2

Un server FTP deve sempre gestire le violazioni del protocollo stesso senza crash. Buttalo via e cercane un altro. –

risposta

5

Recentemente ho risposto a una domanda simile (ish) che può rivelarsi utile - Catch completely unexpected error

EDIT. Devo essere d'accordo con il commento di Hans sopra - potrebbe essere un'idea per trovare un altro server FTP.

Solo per completezza, ecco la configurazione eccezione dominio applicazione/filo da - http://msdn.microsoft.com/en-GB/library/system.windows.forms.application.threadexception.aspx

Application.ThreadException += new ThreadExceptionEventHandler (ErrorHandlerForm.Form1_UIThreadException); 

// Set the unhandled exception mode to force all Windows Forms errors to go through 
// our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
+1

L'AppDomain.UnhandledException si attiva ma l'app termina ancora :(l'eccezione è: il riferimento all'oggetto non è impostato su un'istanza di un oggetto. –

+1

a meno che non si stia facendo qualcosa nel gestore eventi per far sì che il riferimento all'oggetto non sia impostato, quindi non so davvero scusarsi - tutto quello che posso suggerire è provare un altro server FTP. – NDJ

0

probabilmente avete già provato questo, ma solo nel caso, avete provato avvolgendolo in un try catch?

try 
{ 
    _ClsFTPServer = new ClsFTPServer(FTPUserName, FTPPassword, FTPPath); 
    ... 
} 
catch(Exception e) 
{ 
    ... 
} 
+0

Sì, ho provato questo ma non ha funzionato. –

+0

Come non ha funzionato? Devi essere più prolisso o non siamo in grado di trovare una soluzione. "Non ha funzionato" è utile come dire a un dottore "fa male". Dove ti fa male? Che tipo di dolore? –

+1

Sì, non ha funzionato, voglio dire, ho aggiunto il blocco catch try {} e ho spostato l'istanza della classe menzionata all'interno del blocco try, ma quando quella classe ha fallito il blocco catch non funzionava, invece ho gestito l'evento AppDomain.CurrentDomain.UnhandledException, questo evento si verifica e causa l'interruzione dell'app. –

-4

Mettendo una prova ... cattura il blocco attorno a ogni chiamata nell'oggetto e nei suoi metodi.

Qualcosa di simile:

try 
{ 
    // use the DLL in some way 
} 
catch (Exception e) 
{ 
    // Handle the exception, maybe display a warning, log an event, etc.) 
} 

Si noti inoltre che durante l'esecuzione in Visual Studio, se si va al menu "Debug" e selezionare "Eccezioni ..." permetterà il debugger di rompere su tutte le eccezioni se si avvia il programma sotto il debugger e non solo le eccezioni non gestite. Basta fare clic sulla casella di controllo "Gettato" accanto a "Eccezioni di runtime linguaggio comune".

Problemi correlati