usar try form ejemplo como catch bloque c# try-catch using-statement

form - try catch c# messagebox



try/catch+using, sintaxis correcta (7)

Cúal:

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 }


Ambos son sintaxis válida. Realmente se trata de lo que desea hacer: si desea detectar errores relacionados con la creación / eliminación del objeto, utilice el segundo. Si no, usa el primero.


Como usar un bloque es solo una simplificación de sintaxis de un try / finally ( MSDN ), personalmente iría con lo siguiente, aunque dudo que sea significativamente diferente a su segunda opción:

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


Depende. Si usa Windows Communication Foundation (WCF), using(...) { try... } no funcionará correctamente si el proxy en la instrucción using está en estado de excepción, es decir, si desecha este proxy se producirá otra excepción.

Personalmente, creo en un enfoque de manejo mínimo, es decir, solo manejar excepciones de las que tenga conocimiento en el momento de la ejecución. En otras palabras, si sabes que la inicialización de una variable en el using puede arrojar una excepción particular, la envuelvo con try-catch . De manera similar, si dentro del cuerpo que using algo puede ocurrir, que no está directamente relacionado con la variable en el using , entonces lo envuelvo con otra try para esa excepción en particular. Raramente utilizo Exception en mis catch .

Pero sí me gusta IDisposable y using así que quizás sea parcial.


Hay una cosa importante que llamaré aquí: la primera no detectará ninguna excepción que surja de llamar al constructor MyClass .


Si el objeto que está inicializando en el bloque Using () puede arrojar cualquier excepción, entonces debería ir por la segunda sintaxis; de lo contrario, ambas son igualmente válidas.

En mi caso, tuve que abrir un archivo y estaba pasando filePath en el constructor del objeto que estaba inicializando en el bloque Using () y podría lanzar una excepción si el filePath es incorrecto / vacío. Entonces, en este caso, la segunda sintaxis tiene sentido.

Mi código de muestra: -

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


Si su instrucción de captura necesita acceder a la variable declarada en una declaración de uso, entonces el interior es su única opción.

Si su instrucción de captura necesita el objeto al que se hace referencia en el uso antes de que se elimine, entonces, el interior es su única opción.

Si su instrucción de captura toma una acción de duración desconocida, como mostrarle un mensaje al usuario, y desea deshacerse de sus recursos antes de que eso suceda, entonces, afuera es su mejor opción.

Cada vez que tengo un scenerio similar a este, el bloque try-catch generalmente está en un método diferente más arriba en la pila de llamadas del usuario. No es típico que un método sepa cómo manejar las excepciones que ocurren dentro de este modo.

Por lo tanto, mi recomendación general es externa.

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); } }


Yo prefiero el segundo. También puede atrapar errores relacionados con la creación del objeto.