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
}
c#
try-catch
using-statement
Xaqron
fuente
fuente
}
de lausing
declaración puede arrojar una excepción como se recuerda aquí .finally
llame al método de eliminación.Respuestas:
Prefiero el segundo. También puede atrapar errores relacionados con la creación del objeto.
fuente
try
bloque, lo que le permite mostrar un mensaje de error si algo falla, el programa ahora tiene la capacidad de recuperarse e informar al usuario.using( DBConnection conn = DBFactory.getConnection())
que debería revertirse en caso de que ocurriera una excepción. Me parece que ambos tienen su lugar.Dado que un bloque de uso es solo una simplificación de sintaxis de un intento / finalmente ( MSDN ), personalmente iría con lo siguiente, aunque dudo que sea significativamente diferente a su segunda opción:
fuente
finally
es preferible agregar un bloque a lausing
declaración?finally
bloque que disponga de un objeto IDisposable es lo que hace unausing
instrucción. Personalmente, me gusta esto en lugar delusing
bloque incrustado porque creo que establece más claramente dónde está sucediendo todo, y que todo está en el mismo "nivel". También me gusta más que variosusing
bloques incrustados ... pero todo es solo mi preferencia.try
declaración para que se elimine dentro de lafinally
declaración; de lo contrario, arrojará un error de compilación: "Uso de la variable local no asignada 'myObject'"Cannot assign null to implicitly-typed local variable
;) Pero sé lo que quieres decir y personalmente preferiría esto a anidar un bloque de uso.Depende. Si está utilizando Windows Communication Foundation (WCF),
using(...) { try... }
no funcionará correctamente si el proxy en lausing
declaración está en estado de excepción, es decir, eliminar este proxy causará otra excepción.Personalmente, creo en un enfoque de manejo mínimo, es decir, manejar solo una excepción que conozca en el punto de ejecución. En otras palabras, si sabe que la inicialización de una variable
using
puede generar una excepción en particular, la envolverétry-catch
. Del mismo modo, si dentro delusing
cuerpo puede suceder algo, que no está directamente relacionado con la variableusing
, entonces lo envuelvo con otrotry
para esa excepción en particular. Raramente usoException
en micatch
es.Pero sí me gusta
IDisposable
y,using
aunque quizás sea parcial.fuente
Si su declaración catch necesita acceder a la variable declarada en una declaración using, entonces dentro es su única opción.
Si su declaración catch necesita el objeto al que se hace referencia antes de desecharlo, entonces su única opción es dentro.
Si su declaración catch toma una acción de duración desconocida, como mostrar 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 escenario similar a este, el bloque try-catch generalmente está en un método diferente más arriba de la pila de llamadas que el uso. No es típico que un método sepa cómo manejar excepciones que ocurren dentro de él de esta manera.
Así que mi recomendación general es afuera, muy afuera.
fuente
Ambos son sintaxis válida. Realmente se reduce a lo que desea hacer: si desea detectar errores relacionados con la creación / eliminación del objeto, use el segundo. Si no, usa el primero.
fuente
Hay una cosa importante que llamaré aquí: la primera no detectará ninguna excepción derivada de llamar al
MyClass
constructor.fuente
Desde C # 8.0, prefiero usar el segundo igual así
y entonces
fuente
Si el objeto que está inicializando en el bloque Using () podría arrojar alguna excepción, entonces debería optar por la segunda sintaxis, de lo contrario, ambas serían igualmente válidas.
En mi escenario, tuve que abrir un archivo y estaba pasando filePath en el constructor del objeto que estaba inicializando en el bloque Using () y podría arrojar una excepción si filePath está incorrecto / vacío. Entonces, en este caso, la segunda sintaxis tiene sentido.
Mi código de muestra: -
fuente
A partir de C # 8.0 , puede simplificar las
using
declaraciones en algunas condiciones para deshacerse del bloque anidado, y luego solo se aplica al bloque que lo encierra.Entonces sus dos ejemplos se pueden reducir a:
Y:
Ambos son bastante claros; y luego eso reduce la elección entre los dos a una cuestión de lo que quiere que sea el alcance del objeto, dónde desea manejar los errores de instanciación y cuándo desea deshacerse de él.
fuente