2008-10-24 10 views
6

Tengo un código que ignora una excepción específica.Ignorando excepciones

try 
{ 
    foreach (FileInfo fi in di.GetFiles()) 
    { 
     collection.Add(fi.Name); 
    } 
    foreach (DirectoryInfo d in di.GetDirectories()) 
    { 
     populateItems(collection, d); 
    } 
} 
catch (UnauthorizedAccessException ex) 
{ 
    //ignore and move onto next directory 
} 

Por supuesto, esto da como resultado una advertencia de tiempo de compilación como ex no se utiliza. ¿Hay algún estándar aceptar noop que se debería utilizar para eliminar esta advertencia?

Respuesta

12

Sólo reescribir como

catch (UnauthorizedAccessException) {} 
+0

No tenía idea de que era permisible, ingenioso, gracias. – stimms

+0

¡Pero por favor incluya el comentario!Solo un bloque completamente vacío en el código de producción no debe pasar la revisión de código IMO. –

+0

> "Pero por favor aún incluya el comentario ,,,". No estoy de acuerdo con esto "catch (SomeException) {}" ya dice claramente "ignorar SomeException" y, en muchos casos, los comentarios adicionales serán superfluos. – Joe

1

que suele hacer

Debug.WriteLine(ex.message) 

(de esa manera que sólo puede establecer un punto de interrupción en la excepción, si es necesario, también)

2

Como Dave M .y tvanfosson dijo, desea reescribirlo como

catch (UnauthorizedAccessException) {} 

La pregunta más importante que debe hacerse, sin embargo, es por qué está atrapando una excepción al ignorarla (comúnmente llamada deglución de la excepción)? En general, esta es una mala idea, ya que puede (y generalmente lo hace) ocultar problemas en la aplicación en tiempo de ejecución que pueden generar resultados muy extraños y un tiempo difícil para depurarlos.

+0

Al menos es mejor que "catch (Exception) {}". – MusiGenesis

+0

Cierto, pero solo marginalmente mejor. –

+0

Creo que a veces es correcto detectar una excepción y tragarla, pero siempre debe haber un comentario que explique por qué lo hace. –

-1

Aunque soy desarrollador de Java (no C#), @Scott Dorman tiene toda la razón. ¿Por qué estás "tragando la excepción"? Mejor aún, ¿qué podría arrojar la excepción de acceso no autorizada? Aquí hay posibilidades de sentido común:

  1. no existe el archivo
  2. El directorio no existe
  3. El hilo actual del control no tiene los privilegios de seguridad correctas. En el mundo * nix, el hilo actual puede estar en el grupo incorrecto o en el usuario incorrecto.
  4. El disco se colgó
  5. La ACL del archivo está configurada para escribir solo pero no para leer. Del mismo modo, para el directorio.

Lo anterior, por supuesto, es una lista incompleta.

+0

Tres de esas posibilidades de sentido común no lanzarán una Access Access no autorizada. Y los otros dos son exactamente por qué el método se está tragando la excepción: solo quiere los archivos a los que está autorizado acceder. –

1

Suponiendo que el comentario en el código original es una descripción exacta de lo que estás tratando de hacer, creo que quiere escribir así:

foreach (FileInfo fi in di.GetFiles()) 
{ 
    //TODO: what exceptions should be handled here? 
    collection.Add(fi.Name); 
} 

// populate collection for each directory we have authorized access to 
foreach (DirectoryInfo d in di.GetDirectories()) 
{ 
    try 
    { 
     populateItems(collection, d); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     //ignore and move onto next directory 
    } 
} 

Y entonces usted necesita para trabajar en ese TODO ít.

+0

El elemento TODO es fácil, casi seguro que no desea manejar ninguna excepción allí. – Joe

+0

Probablemente tengas razón. Pero no voy a presumir de saber lo que el cartel original pretendía que hiciera el código, y en una revisión del código, haría que me lo diga. –

1

Estoy de acuerdo con las personas que dicen que probablemente sea una mala idea ignorar la excepción. Si no va a volver a lanzarlo, al menos, inicie sesión en algún lugar. He escrito pequeñas herramientas que procesan una lista de archivos donde no quería que los errores en los archivos individuales bloquearan todo el programa, y ​​en esos casos imprimía un mensaje de advertencia para poder ver qué archivos se saltaron.

La única vez que tomo una excepción sin nombrarla, como en catch (xxxException), es si voy a reaccionar de alguna manera y luego volver a lanzarla para poder atraparla. alguna rutina externa. Por ejemplo:

try 
{ 
    // do something 
    // ... 
} 
catch(UnauthorizedAccessException) 
{ 
    // react to this exception in some way 
    // ... 

    // let _someone_ know the exception happened 
    throw; 
}