when stored predefined others handling exceptions java oracle exception-handling ora-00001

java - stored - pl exception handling



Java: encuentre la primera causa de una excepción (9)

Creo que cualquier error que arroje Oracle se verá envuelto en una SQLException (alguien por favor corrígeme si está mal). Una vez que haya accedido a SQLException, debe poder llamar

getErrorCode () Recupera el código de excepción específico del proveedor para este objeto SQLException.

Avíseme si esto funciona, ya que nunca lo intenté :-)

Karl

Necesito comprobar si una excepción es causada por algún problema de la base de datos. Recibo una excepción y compruebo si su causa contiene la cadena "ORA" y la devuelvo (algo así como "ORA-00001"). El problema aquí es que la excepción que recibo está anidada dentro de otras excepciones, por lo que si no averiguo si se trata de una excepción de Oracle, debo verificar la causa de esa excepción y demás. ¿Hay una manera más limpia de hacer esto? ¿Hay alguna forma de conocer la primera causa (la excepción anidada profunda) de una excepción dada?

Mi código actual se ve así:

private String getErrorOracle(Throwable e){ final String ORACLE = "ORA"; if (e.getCause() != null && e.getCause().toString().contains(ORACLE)){ return e.getCause().toString(); } else if(e.getCause() != null){ return getErrorOracle(e.getCause()); } else { return null; } }


Para no reinventar la rueda, si está utilizando Apache Commons Lang , mire ExceptionUtils.getRootCause() .

¿Vale la pena incluir una biblioteca solo para eso? Tal vez no. Pero si ya lo tiene en su ruta de clases, está ahí para usted, y tenga en cuenta que hace algunas cosas que una implementación "ingenua" podría no hacer (por ejemplo, tratar con ciclos en la cadena de causas ... ¡uf!)


Podría mejorar su verificación de código para SQLException

import java.sql.SQLException; private static final String ORACLE = "ORA"; public String doHandle(Throwable t) { if (t.getClass().isAssignableFrom(SQLException.class)) { SQLException e = (SQLException) t; int errCode = e.getErrorCode(); String state = e.getSQLState(); String msg = e.getMessage(); if (msg.contains(ORACLE)) { return msg; } } else { if (t.getCause() != null) { return this.doHandle(t.getCause()); } } return ""; }

Además, creo que en Oracle "errCode" contiene el número asociado a ORA-nnnn


Probablemente sea un poco exagerado para su uso, pero creo que es más limpio (y reutilizable)

interface ThrowablePredicate { boolean accept(Throwable t); } public OracleErrorThrowablePredicate implements ThrowablePredicate { private static final ORA_ERR = "ORA"; public boolean accept(Throwable t) { return t.toString().contains(ORA_ERR); } } public class CauseFinder { private ThrowablePredicate predicate; public CauseFinder(ThrowablePredicate predicate) { this.predicate = predicate; } Throwable findCause(Throwable t) { Throwable cause = t.getCause(); return cause == null ? null : predicate.accept(cause) ? cause : findCause(cause) } } // Your method private String getErrorOracle(Throwable e){ return new CauseFinder(new OracleErrorThrowablePredicate()).findCause(e); }


Si la excepción que se lanza siempre va a ser de un tipo específico, como OracleException, puede detectar solo esa excepción.

Por ejemplo:

try { ... } catch(OracleException oe) { ... }

Esto solo se aplicaría si hay excepciones específicas de Oracle lanzadas. No sé mucho sobre Oracle, así que antes de intentar esto, probablemente querrás averiguar si eso es lo que está sucediendo.



Simplemente atraviese la cadena de excepciones hasta llegar a una excepción sin causa, y luego simplemente devuelva ese mensaje, si quiere la última.

Su función solo obtendrá la primera causa, si hay una.

Sin embargo, es posible que desee buscar la primera causa en su paquete, ya que la más profunda puede ser una excepción de Oracle, lo cual es útil, pero a menos que pueda ver dónde creó el problema, tendrá dificultades para solucionarlo.


el 28-01-2015 , no he podido resolver mi problema con ninguna de las soluciones anteriores, por lo que mi recomendación es usar:

e.getMessage().toString();

PD: lo estoy usando en Android.


puede usar getStackTrace() de la clase Throwable. Esto le daría la pila de StackTraceElements para trabajar. Puede iterar a través de StackTraceElements [] para encontrar la cadena "ORA".

Avísame si necesitas un ejemplo.