Tengo un código de captura de prueba:
try
{
...
}
catch(Exception ex)
{
ModelState.AddModelError(
"duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}
Para este fragmento de código, estoy tratando de insertar un registro en una base de datos: el dba lo ha configurado para que la base de datos busque duplicados y devuelva un error si hay duplicados. Actualmente, como puede ver, estoy agregando el mismo error al modelo sin importar qué error haya ocurrido. Quiero que se cambie, por lo 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?
c#
asp.net-mvc
exception-handling
AnonyMouse
fuente
fuente
Exception
no es una buena práctica. Debe ser lo más específico posible y dejar que todo lo que no pueda manejar llegue al usuario / marco.Respuestas:
antes de su captura actual agregue lo siguiente:
catch(DbUpdateException ex) { if(ex.InnerException is UpdateException) { // do what you want with ex.InnerException... } }
Desde C # 6, puede hacer lo siguiente:
catch(DbUpdateException ex) when (ex.InnerException is UpdateException) { // do what you want with ex.InnerException... }
fuente
catch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
Reemplace
System.Threading.ThreadAbortException
con su 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 } }
fuente
Para obtener el nombre de la excepción, puede usar
catch (Exception exc){ if (exc.GetType().FullName == "Your_Exception") { // The same can be user for InnerExceptions // exc.InnerException.GetType().FullName } }
fuente
No hay suficiente representante para comentar. En respuesta a la pregunta de @conterio (en la respuesta de @Davide Piras):
Ahi esta.
catch (Exception e) when (!(e is ArgumentException)) { }
fuente
Puede echar un vistazo a la clase SQLException y verificar el contenido del mensaje de la excepción si contiene lo que ahora 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 } }
fuente