Java - 예외의 첫 번째 원인을 찾습니다.
데이터베이스 문제로 인해 예외가 발생하는지 확인해야 합니다.예외를 수신하고, 그 원인에 「ORA」문자열이 포함되어 있는지를 확인해, 그 문자열(「ORA-00001」등)을 반환합니다.여기서의 문제는 수신되는 예외가 다른 예외 내에 중첩되어 있기 때문에 Oracle 예외인지 아닌지를 알 수 없는 경우 해당 예외의 원인을 확인해야 한다는 것입니다.좀 더 깔끔한 방법이 없을까요?특정 예외의 첫 번째 원인(깊은 예외)을 알 수 있는 방법이 있습니까?
현재 코드는 다음과 같습니다.
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;
}
}
Apache Commons Lang을 사용하는 경우 휠을 재창조하지 않기 위해 Exception Utils.get Root Cause()를 참조하십시오.
그것만으로 도서관을 포함할 가치가 있나요?아닐 수도 있어요.그러나 클래스 패스에 이미 있는 경우, 이 솔루션은 고객의 요구에 부응합니다.또, 「순진한」실장에서는 실현되지 않는 몇개의 기능(예를 들면, 원인 체인의 사이클에의 대처 등)을 발휘합니다.
이미 Throwables.getRootCause()가 아닌 Guava에 있는 경우 구조 작업을 수행합니다.
이유 없이 예외에 도달할 때까지 예외 체인을 통과한 후 마지막 메시지를 반환하면 됩니다.
첫 번째 원인이 있는 경우 첫 번째 원인만 얻을 수 있습니다.
패키지에서 첫 번째 원인을 찾는 것이 좋을 수 있습니다.실제로 가장 깊은 원인은 Oracle 예외일 수 있습니다.이 예외는 도움이 됩니다만, 문제의 원인이 어디에 있는지 알 수 없는 한 수정에 어려움을 겪을 수 있습니다.
사용법에 비해 다소 과잉인 것 같습니다만, 보다 청결하고(재이용 가능)하다고 생각합니다.
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);
}
oracle에 의해 발생하는 오류는 SQLException으로 포장될 것이라고 생각합니다(잘못되면 정정해 주세요).SQLException에 접속하면 다음 주소로 전화할 수 있습니다.
getErrorCode() 이 SQLException 객체의 벤더 고유 예외 코드를 가져옵니다.
한 번도 먹어본 적이 없기 때문에 효과가 있는지 알려주세요:-)
칼
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 "";
}
또한 Oracle에서 "errCode"에는 ORA-nnnn과 관련된 번호가 포함되어 있다고 생각합니다.
부츠를 위한 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」getRootCauseIDEA 3 idea를를 Import 。
코어: ★★★★★★★★★★★★★★★★★★:org.springframework.core.NestedExceptionUtils.getRootCause
슨:com.fasterxml.jackson.databind.util.ClassUtil.getRootCause
과바(스葉)com.google.common.base.Throwables.getRootCause
스마트한체크 ) 은 봄입니다.NestedExceptionUtils.getRootCause가 ,, 인,없 returns . . . . . . . . . . . . . . . . . . . . . . .를 반환합니다.null
@NonNull
public static Throwable getRootCause(@NonNull Throwable t) {
Throwable rootCause = NestedExceptionUtils.getRootCause(t);
return rootCause != null ? rootCause : t;
}
ExceptionUtils.getRootCause() 및 Throwables.getRootCause()는 전달되는 예외의 원인이 null인 경우 null을 반환합니다.다음 메서드는 원인 없는 슬로우 가능이 입력 파라미터로 전달될 경우 원래 슬로우 가능을 반환합니다.
/**
* @return the root cause of a given throwable.
* If throwable without a cause is being passed, the original throwable will be returned
*/
public static Throwable getRootCause(@NonNull final Throwable throwable) {
List<Throwable> throwableList = ExceptionUtils.getThrowableList(throwable);
return throwableList.get(throwableList.size() - 1);
}
핵심 Java API를 사용한 단일 라인 솔루션:
try {
i = 1 / 0;
} catch (ArithmeticException e) {
System.out.println(new ArithmeticException().initCause(e).getCause());
}
이하의 솔루션도 1개 더 유효합니다.
try {
i = 1 / 0;
} catch (ArithmeticException e) {
System.out.println(new Exception().initCause(e).getCause());
}
둘 다 인쇄합니다.
java.displaces를 클릭합니다.산술 예외: / 0 기준
근본 원인을 얻기 위해 Kotlin 확장 함수를 추가합니다.
fun Throwable.rootCause(): Throwable {
return if (cause == null) this else cause!!.rootCause()
}
//Return null if first cause is null
fun Throwable.optRootCause(): Throwable? {
return if (cause == null) null else cause!!.rootCause()
}
또는 임의의 시점에서 던질 수 있는 체인 내부에서 원인을 찾아야 하는 경우에는 다음과 같이 하십시오.
fun <T : Throwable> Throwable.isOrContainsCauseOfType(clazz: KClass<T>): Throwable? {
return when {
clazz.isInstance(this) -> this //remove if you want to exclude [this]
cause == null -> null
clazz.isInstance(cause) -> cause
else -> cause!!.isOrContainsCauseOfType(clazz)
}
}
발생하는 예외가 Oracle Exception과 같은 특정 유형인 경우 해당 예외만 탐지할 수 있습니다.
예를 들어 다음과 같습니다.
try {
...
} catch(OracleException oe) {
...
}
이는 특정 Oracle 예외가 발생한 경우에만 적용됩니다.저는 Oracle에 대해 잘 모르기 때문에 이 작업을 시도하기 전에 Oracle에 대해 알아보시기 바랍니다.
2015년 1월 28일, 위의 어느 솔루션에서도 문제를 해결할 수 없기 때문에, 다음을 사용하는 것을 추천합니다.
e.getMessage().toString();
ps: 안드로이드에서 사용하고 있습니다.
언급URL : https://stackoverflow.com/questions/1791610/java-find-the-first-cause-of-an-exception
'programing' 카테고리의 다른 글
| 태그 배열 정렬 문제 (0) | 2023.02.28 |
|---|---|
| 그렇지 않으면 Angular에 있는 문JS 템플릿 (0) | 2023.02.28 |
| JSON.parse vs. eval() (0) | 2023.02.28 |
| 바이트 배열을 JSON 형식으로 변환합니다. (0) | 2023.02.23 |
| angular 템플릿의 배열 값을 확인하시겠습니까? (0) | 2023.02.23 |