Quando usare i blocchi try / catch?

Ho letto e capito cosa fa un blocco Try / Catch e perché è importante usarne uno. Ma sono bloccato a sapere quando / dove usarli. Qualche consiglio? Inserirò un esempio del mio codice qui sotto nella speranza che qualcuno abbia del tempo per formulare alcune raccomandazioni per il mio esempio.

public AMPFileEntity(string filename) { transferFileList tfl = new transferFileList(); _AMPFlag = tfl.isAMPFile(filename); _requiresPGP = tfl.pgpRequired(filename); _filename = filename.ToUpper(); _fullSourcePathAndFilename = ConfigurationSettings.AppSettings.Get("sourcePath") + _filename; _fullDestinationPathAndFilename = ConfigurationSettings.AppSettings.Get("FTPStagePath") + _filename; _hasBeenPGPdPathAndFilename = ConfigurationSettings.AppSettings.Get("originalsWhichHaveBeenPGPdPath"); } public int processFile() { StringBuilder sb = new StringBuilder(); sb.AppendLine(" "); sb.AppendLine(" --------------------------------"); sb.AppendLine(" Filename: " + _filename); sb.AppendLine(" AMPFlag: " + _AMPFlag); sb.AppendLine(" Requires PGP: " + _requiresPGP); sb.AppendLine(" --------------------------------"); sb.AppendLine(" "); string str = sb.ToString(); UtilityLogger.LogToFile(str); if (_AMPFlag) { if (_requiresPGP == true) { encryptFile(); } else { UtilityLogger.LogToFile("This file does not require encryption. Moving file to FTPStage directory."); if (File.Exists(_fullDestinationPathAndFilename)) { UtilityLogger.LogToFile(_fullDestinationPathAndFilename + " alreadyexists. Archiving that file."); if (File.Exists(_fullDestinationPathAndFilename + "_archive")) { UtilityLogger.LogToFile(_fullDestinationPathAndFilename + "_archive already exists. Overwriting it."); File.Delete(_fullDestinationPathAndFilename + "_archive"); } File.Move(_fullDestinationPathAndFilename, _fullDestinationPathAndFilename + "_archive"); } File.Move(_fullSourcePathAndFilename, _fullDestinationPathAndFilename); } } else { UtilityLogger.LogToFile("This file is not an AMP transfer file. Skipping this file."); } return (0); } private int encryptFile() { UtilityLogger.LogToFile("This file requires encryption. Starting encryption process."); // first check for an existing PGPd file in the destination dir. if exists, archive it - otherwise this one won't save. it doesn't overwrite. string pgpdFilename = _fullDestinationPathAndFilename + ".PGP"; if(File.Exists(pgpdFilename)) { UtilityLogger.LogToFile(pgpdFilename + " already exists in the FTPStage directory. Archiving that file." ); if(File.Exists(pgpdFilename + "_archive")) { UtilityLogger.LogToFile(pgpdFilename + "_archive already exists. Overwriting it."); File.Delete(pgpdFilename + "_archive"); } File.Move(pgpdFilename, pgpdFilename + "_archive"); } Process pProc = new Process(); pProc.StartInfo.FileName = "pgp.exe"; string strParams = @"--encrypt " + _fullSourcePathAndFilename + " --recipient infinata --output " + _fullDestinationPathAndFilename + ".PGP"; UtilityLogger.LogToFile("Encrypting file. Params: " + strParams); pProc.StartInfo.Arguments = strParams; pProc.StartInfo.UseShellExecute = false; pProc.StartInfo.RedirectStandardOutput = true; pProc.Start(); pProc.WaitForExit(); //now that it's been PGPd, save the orig in 'hasBeenPGPd' dir UtilityLogger.LogToFile("PGP encryption complete. Moving original unencrypted file to " + _hasBeenPGPdPathAndFilename); if(File.Exists(_hasBeenPGPdPathAndFilename + _filename + "original_which_has_been_pgpd")) { UtilityLogger.LogToFile(_hasBeenPGPdPathAndFilename + _filename + "original_which_has_been_pgpd already exists. Overwriting it."); File.Delete(_hasBeenPGPdPathAndFilename + _filename + "original_which_has_been_pgpd"); } File.Move(_fullSourcePathAndFilename, _hasBeenPGPdPathAndFilename + _filename + "original_which_has_been_pgpd"); return (0); } } 

}

La regola generale per rilevare le eccezioni consiste nel rilevare eccezioni se e solo se si dispone di un modo significativo di gestirle .

Non prendere un’eccezione se stai solo registrando l’eccezione e gettala nello stack. Non serve alcun significato e codice di clutter.

Rileva un’eccezione quando ti aspetti un errore in una parte specifica del tuo codice e se hai una riserva per questo.

Ovviamente hai sempre il caso di eccezioni controllate che richiedono l’utilizzo di blocchi try / catch, nel qual caso non hai altra scelta. Anche con un’eccezione controllata, assicurati di accedere correttamente e gestisci il più pulito ansible.

Eccezioni e gestione delle eccezioni (C # Programming Guide)

Eccezioni e gestione delle eccezioni (C # Programming Guide) Link aggiornato (da MS) anche se l’altro è ancora attuale.

Gestione delle eccezioni (C # Programming Guide)

Come altri hanno già detto, vuoi provare a usare il catch catch attorno al codice che può generare un’eccezione e che sei pronto a gestire.

Per alcuni esempi specifici, File.Delete può generare numerose eccezioni, tra cui IOException, UnauthorizedAccessException e altre. Cosa vorresti che la tua applicazione facesse in quelle situazioni? Se provi a eliminare il file ma qualcuno da qualche altra parte lo sta usando, otterrai una IOException.

  try { File.Delete(pgpdFilename + "_archive") } catch(IOException) { UtilityLogger.LogToFile("File is in use, could not overwrite."); //do something else meaningful to your application //perhaps save it under a different name or something } 

Inoltre, tieni presente che se ciò non dovesse riuscire, allora anche il file .Move che fai al di fuori del tuo blocco if non andrà a buon fine (di nuovo a un IOException – poiché il file non è stato cancellato, è ancora lì che farà fallire lo spostamento) .

Mi è stato insegnato a utilizzare try / catch / finally per tutti i metodi / classi in cui potrebbero verificarsi più errori e che è ansible gestire effettivamente . Transazioni di database, I / O FileSystem, streaming, ecc. La logica di base di solito non richiede try / catch / finally.

La parte migliore di try / catch / finally è che puoi avere più catch in modo che tu possa creare una serie di gestori di eccezioni per gestire errori molto specifici o usare un’eccezione generale per cogliere gli errori che non vedi arrivare.

Nel tuo caso, stai usando File.Exists che è buono, ma forse è un altro problema con il disco che potrebbe generare un altro errore che File.Exists non è in grado di gestire. Sì, è un metodo booleano, ma dì che il File è bloccato e cosa succede se provi a scrivere su di esso? Con la cattura, puoi pianificare uno scenario raro, ma senza try / catch / finally, potresti esporre il codice a condizioni completamente impreviste.

Gli altri ragazzi hanno dato un buon numero di buoni consigli e riferimenti.

Il mio contributo è breve:
Quando usarlo è una cosa, in modo uguale o più importante è come usarlo correttamente.

PS: “it” è refeings per “cercare di catturare le eccezioni”.