2012-02-14 26 views
39

tengo una pieza de código intento de captura:Cómo determinar si una excepción es de un tipo particular

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    ModelState.AddModelError(
     "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique"); 
} 

Para este trozo de código que estoy tratando de insertar un registro en una base de datos: El DBA tiene configúrelo para que la base de datos verifique si hay duplicados y devuelve un error si hay duplicados. Actualmente, como puede ver, agrego el mismo error al modelo sin importar el error que haya ocurrido. Quiero que cambie así que este error solo se agrega al modelo si fue causado por el error duplicado configurado por el dba.

A continuación se muestra el error que quiero detectar. Tenga en cuenta que está en la excepción interna. ¿Alguien puede decirme cómo atrapar específicamente este?

enter image description here

+0

Sede de Davide. Generalmente capturar 'Excepción' no es una mejor práctica. Debes ser lo más específico posible y dejar que todo lo que no puedas manejar aparezca en el usuario/framework. – Ryan

+1

Salida esta respuesta: http://stackoverflow.com/questions/3967140/c-sharp-entity-framework-duplicate-unique-exception –

Respuesta

75

antes su captura actual añadir lo siguiente:

catch(DbUpdateException ex) 
{ 
    if(ex.InnerException is UpdateException) 
    { 
    // do what you want with ex.InnerException... 
    } 
} 
-1

se puede tomar un vistazo a la clase SQLException - y comprobar si el contenido del mensaje de excepción si contiene lo ahora se ve en su excepción interna ... Algo como esto:

try 
{ 
    //your code here 
} 
catch (SQLException ex) 
{ 
    if (ex.Message.Contains("Cannot insert duplicate key in obj....")) 
    { 
     //your code here 
    } 
} 
+1

dudo que SqlException se lanza directamente, sino sólo como una excepción interna . Además, probablemente sería mejor verificar el número de error en lugar de compararlo con el texto del mensaje. –

+0

Sí, también puedes verificar el número de error. Gracias por el comentario. –

+0

¿Cómo se compara con el número de error? Ni siquiera estoy seguro de cuál es su número, ya que es un error realmente específico. – AnonyMouse

8

Reemplazar System.Threading.ThreadAbortException con tu excepción

try 
{ 
    //assume ThreadAbortException occurs here 
} 
catch (Exception ex) 
{ 
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException))) 
    { 
     //what you want to do when ThreadAbortException occurs   
    } 
    else 
    { 
     //do when other exceptions occur 
    } 
} 
0

HAC significa

catch (Exception e){ 
    if (e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException") 
    //if (e.GetType().Name == .....) 
} 
0

Para obtener el nombre de la excepción puede utilizar respuesta

catch (Exception exc){ 
     if (exc.GetType().FullName == "Your_Exception") 
     { 
      // The same can be user for InnerExceptions 
      // exc.InnerException.GetType().FullName 
     } 
    } 
Cuestiones relacionadas