try / catch + using, syntax corretta

Quale:

using (var myObject = new MyClass()) { try { // something here... } catch(Exception ex) { // Handle exception } } 

O

 try { using (var myObject = new MyClass()) { // something here... } } catch(Exception ex) { // Handle exception } 

    Preferisco il secondo. Può anche trattenere errori relativi alla creazione dell’object.

    Dal momento che un blocco using è solo una semplificazione della syntax di un try / finally ( MSDN ), personalmente andrei con quanto segue, anche se dubito che sia significativamente differente dalla tua seconda opzione:

     MyClass myObject = null; try { myObject = new MyClass(); //important stuff } catch (Exception ex) { //handle exception } finally { if(myObject is IDisposable) myObject.Dispose(); } 

    Se la tua dichiarazione di cattura ha bisogno di accedere alla variabile dichiarata in un’istruzione using, allora l’unica opzione è all’interno.

    Se l’istruzione catch richiede l’object a cui si fa riferimento nell’uso prima che venga eliminato, allora l’unica opzione è all’interno.

    Se la tua dichiarazione di cattura prende un’azione di durata sconosciuta, come la visualizzazione di un messaggio per l’utente, e desideri disporre delle tue risorse prima che ciò accada, allora all’esterno è la scelta migliore.

    Ogni volta che ho uno scenerio simile a questo, il blocco try-catch è di solito in un altro metodo più in alto nello stack di chiamate dall’utilizzo. Non è tipico per un metodo sapere come gestire le eccezioni che si verificano al suo interno in questo modo.

    Quindi la mia raccomandazione generale è fuori dall’esterno.

     private void saveButton_Click(object sender, EventArgs args) { try { SaveFile(myFile); // The using statement will appear somewhere in here. } catch (IOException ex) { MessageBox.Show(ex.Message); } } 

    Dipende. Se si utilizza Windows Communication Foundation (WCF), l’ using(...) { try... } non funzionerà correttamente se il proxy using dell’istruzione si trova in stato di eccezione, ovvero l’eliminazione di questo proxy causerà un’altra eccezione.

    Personalmente, credo nell’approccio minimo alla gestione, ovvero gestisco solo le eccezioni di cui sei a conoscenza al momento dell’esecuzione. In altre parole, se sai che l’inizializzazione di una variabile using può generare una particolare eccezione, la avvolgo con try-catch . Allo stesso modo, se all’interno del corpo può accadere qualcosa, che non è direttamente correlato alla variabile in using , allora lo avvolgo con un altro try per quella particolare eccezione. Raramente uso Exception nella mia catch .

    Ma mi piace IDisposable e using comunque così forse prevenuto.

    Entrambi sono syntax valida. Dipende davvero da cosa vuoi fare: se vuoi catturare gli errori relativi alla creazione / eliminazione dell’object, usa il secondo. In caso contrario, utilizzare il primo.

    C’è una cosa importante che chiamerò qui: la prima non catturerà alcuna eccezione derivante dal chiamare il costruttore MyClass .

    Se l’object che si sta inizializzando nel blocco Using () potrebbe lanciare qualche eccezione, si dovrebbe andare alla seconda syntax, altrimenti entrambe ugualmente valide.

    Nel mio scenario, ho dovuto aprire un file e stavo passando filePath nel costruttore dell’object che stavo inizializzando nel blocco Using () e potrebbe generare un’eccezione se il filePath è sbagliato / vuoto. Quindi in questo caso, la seconda syntax ha senso.

    Il mio codice di esempio: –

     try { using (var obj= new MyClass("fileName.extension")) { } } catch(Exception ex) { //Take actions according to the exception. }