Java Exception 인스턴스 세부 정보 캡처 및 표시
자바 B/S 구조 개발을 진행할 때 자주 이런 장면이 있다. 백엔드 처리 업무 논리, 백엔드 처리 전시를 책임지고 백엔드 처리에 이상이 발생할 때 어떻게 잘못된 정보를 백엔드에 전시합니까?오류 정보 창고는 통상적으로 매우 많아서 개발자가 문제를 찾는 데 비교적 편리하지만 고객에게 있어서 한 무더기의 오류 정보는 의심할 여지없이 그들의 감각에 대한 파괴이다. 어떻게 가장 중요한 정보를 클라이언트에게 표시할 수 있습니까?이 정보는 간단명료하고 오류점을 가리키며 이상한 유형을 가리켜야 한다.
많은 경우 Exception의 getMessage () 방법은 빈 값을 되돌려줍니다. 이 방법을 사용하면 앞에 빈 값을 표시합니다.중요한 정보는 다음과 같습니다.
Exception의 getClass () 를 사용할 수 있습니다.getName () 메서드를 사용하여 수행할 수 있습니다.
2、오류점은 어떻게 얻나요?
오류 지점 정보는 일반적으로 "Cause by:"표지에서 시작하는 줄입니다.이 행을 캡처할 수 있는 경우 다음과 같은 예외 스택 예제를 사용하여 예외 정보를 추출할 수 있습니다.
Caused by: org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF>
at org.apache.activemq.selector.SelectorParser.generateParseException(SelectorParser.java:1231)
at org.apache.activemq.selector.SelectorParser.jj_consume_token(SelectorParser.java:1179)
at org.apache.activemq.selector.SelectorParser.unaryExpr(SelectorParser.java:468)
at org.apache.activemq.selector.SelectorParser.multExpr(SelectorParser.java:390)
at org.apache.activemq.selector.SelectorParser.addExpression(SelectorParser.java:359)
at org.apache.activemq.selector.SelectorParser.comparisonExpression(SelectorParser.java:211)
at org.apache.activemq.selector.SelectorParser.equalityExpression(SelectorParser.java:156)
at org.apache.activemq.selector.SelectorParser.andExpression(SelectorParser.java:135)
at org.apache.activemq.selector.SelectorParser.orExpression(SelectorParser.java:114)
at org.apache.activemq.selector.SelectorParser.JmsSelector(SelectorParser.java:106)
at org.apache.activemq.selector.SelectorParser.parse(SelectorParser.java:84)
... 63 more
일부 원인으로 인해 종종 첫 번째 줄에 나타나지 않기 때문에 첫 번째 줄을 취하는 방식으로 오류점과 오류 알림 정보를 얻을 수 없다.이 출력을 해석하면 한 줄 한 줄 읽은 다음 첫 문자가 "Caused by:"인지 판단하면 오류점과 오류 정보를 잡을 수 있습니다.
가장 간단한 방법은 정규 표현식을 사용하면 오류점과 오류 정보를 비교적 간단하게 캡처할 수 있다.예:
코드 1: 정규 표현식을 사용하여 오류점과 오류 정보를 가져옵니다.
String regEx = "Caused by:(.*)";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(content);
boolean rs = mat.find();
System.out.println("found?" + rs);
System.out.println(mat.group(1));
코드 1의 결과 출력:
org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF>
3. 이상 정보 획득잘못된 점을 찾아내는 방법을 알았지만 이상 정보는 어떻게 얻었을까?Exception.printStrackTrace()에서 오류가 발생했지만 콘솔에 연결했습니다. Exception.getStackTrace(), 오류 지점에 대한 프롬프트 정보를 얻을 수 없습니다.
하나의 대응 방법은 e.print Strack Trace () 출력을 포획하고 e.print Stack Trace (Print Stream) 방법을 사용하여 이상 창고 정보를 Byte Output Stream에 먼저 출력한 다음에 Byte Output Stream을 문자열로 바꾸면 이상한 완전한 출력을 얻을 수 있다.코드:
코드 2: 전체 이상 정보 가져오기
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String exception = baos.toString();
System.out.println("baos:" + exception);
전체 테스트 코드 - 이상 Caused by 캡처 (주: 이 테스트 코드에는 Caused by 문자가 나타나지 않고 실제 응용 코드가 많아 테스트 용례에 포함되지 않음):
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexpTest {
/**
*
* @return
*/
public String readFile(){
try {
String fileName = "D:\\test2\\exception.log";
File f = new File(fileName);
FileInputStream fis = new FileInputStream(f);
int filesize = fis.available();
byte[] buffer = new byte[filesize];
fis.read(buffer);
return new String(buffer);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
*/
public void test(){
try {
String content = readFile();
System.out.println(content);
String regEx = "Caused by:(.*)";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(content);
boolean rs = mat.find();
System.out.println("found?" + rs);
System.out.println(mat.group(1));
// for(int i=1;i<=mat.groupCount();i++){
// System.out.println("found:" + mat.group(i));
// }
} catch (Exception e) {
e.printStackTrace();
}
}
public void test2(){
try {
FileInputStream fis = new FileInputStream("d:\\test.txt");
fis.read();
} catch (Exception e) {
e.printStackTrace();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String exception = baos.toString();
System.out.println("exception:" + exception);
}
}
public static void main(String[] args) {
RegexpTest rt = new RegexpTest();
//rt.test();
rt.test2();
}
4. 이상 유형과 오류점을 얻는 간단한 방법오류 유형 가져오기:
e.getCause().getClass()
오류 지점 정보 가져오기 (오류 원인):
e.getCause().getMessage()
코드 예제 (주: 실제 코드 캡처, 직접 실행할 수 없음):
@SuppressWarnings("unchecked")
@RequestMapping(value="/createSubscriber", method = RequestMethod.POST)
public @ResponseBody
WrappedResult createSubscriber(@ItemsRequestBody List<Map> list) {
LocalBrokerFacade facade = new LocalBrokerFacade(BrokerRegistry.getInstance().findFirst());
WrappedResult result = new WrappedResult();
try {
Map params = list.get(0);
String clientId = (String)params.get("clientId");
String subscriberName = (String)params.get("subscriberName");
String topicName = (String)params.get("topicName");
String selector = (String)params.get("selector");
// if("".equals(selector)){
// selector = null;
// }
facade.getBrokerAdmin().createDurableSubscriber(clientId,
subscriberName,topicName,selector);
result.setSuccessful(true);
} catch (Exception e) {
System.out.println("Exception:" + e.getCause().getClass() + "," + e.getCause().getMessage());
//log.error("createSubscriber failed.", e);
}
출력:
Exception:class org.apache.activemq.selector.ParseException,Parse error at line 0, column 0. Encountered: <EOF>
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.