JAVA 이상 의 최고의 공학 실천 탐구
왕 이 클 라 우 드 커 뮤 니 티 를 방문 하여 더 많은 왕 이 기술 제품 의 운영 경험 을 알 아 보 는 것 을 환영 합 니 다.
먼저 배경 설명:
폼 매개 변수 검사 에서 이상 하 게 사용 하 는 제안
이상 메커니즘 에 존재 하 는 가장 큰 장점 은 JAVA 함수 가'다 중 반환 값'을 실현 하 는 것 이다.예 를 들 어:
public int caculate(int a, int b) throws MyException {
}
이 코드 의 본질은 함수 caculate 가 이러한 반환 값[int,MyException]을 가지 게 하 는 것 입 니 다.이렇게 하면 무슨 좋 은 점 이 있 습 니까?
이상 을 사용 하지 않 는 다 고 가정 하면 위의 함 수 는-1,-2 와 같은 마법 수 로 만 이상 상황 을 표현 할 수 있 습 니 다.이렇게 하면 비교적 나 쁠 수 있 습 니 다.이 함 수 를 사용 하 는 사람 은 반환 값 의 이 마법 수 를 매우 조심스럽게 처리 해 야 하기 때 문 입 니 다.항상 빠 지기 쉬 운 일 입 니 다.
이렇게 보면 입 참 검 사 를 할 때 비합법적 인 파 라미 터 를 발견 하고 IllegalArgument Exception 으로 돌아 가 는 것 은 매우 합 리 적 이 고 자 연 스 러 운 용법 이다.
웹 폼 장면 과 결합 하여 사용자 가 입력 한 매개 변 수 를 검증 하 는 것 이 라 고 가정 합 니 다.배경 검증 이 합 법 적 이지 않 습 니 다.MVC 의 Controller 층 이 통일 적 으로 패키지 하여 전단 에 되 돌아 가 는 것 은 비교적 우아 한 방법 이 고 전단 은 백 엔 드 의 되 돌아 오 는 데이터 구조 에 맞 춰 유용 한 오류 정 보 를 사용자 에 게 보 여 주 는 것 입 니 다.앞에서 언급 한 배경 과 결합 하면 여기 서 발생 하 는 이상 은 스 택 로 그 를 인쇄 해 서 는 안 됩 니 다.그렇지 않 으 면 보초병 의 오보(오보 라 고 하 는 이 유 는 흔히 볼 수 있 는 상황 이기 때문에 운영 자 들 의 주 의 를 끌 지 말고 처리 에 개입 해 서 는 안 됩 니 다)를 초래 할 수 있 습 니 다.건의 하 는 방법 은 해당 하 는 이상 로 그 를 기록 하 는 것 입 니 다.
보초병 의 오보 신고 가 없 었 다 면 창고 일 지 를 인쇄 할 필요 가 있 었 을 까?일반적으로 인쇄 이상 스 택 은 운영 자(또는 개발 자)가 이상 원인 을 신속하게 찾 아 이상 을 복구 하 는 데 도움 을 주기 위해 서 이다.한편,이곳 의 장면 은 운영 자가 개입 할 필요 가 없고 전단 페이지 에서 사용자 에 게 알려 주 며 사용자 가 해당 하 는 파 라 메 터 를 조정 한 후에 다시 요청 하면 회복 할 수 있다.
좀 수 다스 럽 게 말 하지만 사실은 이러한 관점 을 더욱 명확 하 게 강조 하기 위해 서 입 니 다.이상 을 사용 하 는 것 은 반드시 스 택 을 인쇄 해 야 하 는 것 이 아 닙 니 다.예 를 들 어 웹 폼 이 참 여 된 검 측 등 입 니 다.
dubbo 인터페이스 에서 이상 하 게 사용 하 는 제안
먼저 몇 개의 dubbo 이상 과 관련 된 흔 한 문 제 를 던 집 니 다.
상기 두 문제 의 발생 은 dubbo 의 실현 과 관련 이 있 습 니 다.dubbo 가 이상 을 어떻게 처리 하 는 지 보 겠 습 니 다(ExceptionFilter).
Result result = invoker.invoke(invocation);if (result.hasException() && GenericService.class != invoker.getInterface()) { try {
Throwable exception = result.getException(); // checked ,
if (! (exception instanceof RuntimeException) && (exception instanceof Exception)) { return result;
} // ,
try {
Method method = invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes());
Class>[] exceptionClassses = method.getExceptionTypes(); for (Class> exceptionClass : exceptionClassses) { if (exception.getClass().equals(exceptionClass)) { return result;
}
}
} catch (NoSuchMethodException e) { return result;
} // , ERROR
logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()
+ ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()
+ ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), exception);
...
이 를 통 해 알 수 있 듯 이 unchecked 이상 이 성명 을 표시 하지 않 으 면 error 로 그 를 자동 으로 인쇄 합 니 다.
그럼 어떻게 우아 하 게 해결 해 야 하나 요?
Response r;try {
r = ...;
} catch (RuntimeException e) {
logger.error("error msg", e);// ,
r = Response.buildErrorResponse(e.getMessage());
}return r;
이상 사용 vs null 사용
앞에서 언급 했 듯 이 이상 한 사용 은 인 코딩 의 편 의 를 가 져 올 수 있 지만 더 많은 무용 로그 출력 에 위험 을 묻 었 다.위의 포장 코드 의 예 를 들 어 Runtime Exception 이 네트워크 연결 이나 데이터 베이스 연결 이 이상 하 다 면 유용 한 이상 에 속 하지만 특정한 데이터 가 존재 하지 않 기 때문에 Illegal Argument Exception 을 던 진 것 이 라면 로 그 는 좀 불필요 해 보인다(로그 내용 에 따라 효과 적 인 행동 으로 막 을 수 없다).
public Permission loadPermission(Long userId) { if(...) { return ...
} else { throw new IllegalArgumentException();// or throw new NotFoundException();
}
}
이러한 표기 법 에서 loadPermission 은 try{...}catch(){...}의 추가'보살핌'이 필요 합 니 다.좀 번 거 롭 지 않 습 니까?이때 바로 null 로 돌아 가면 더 직접적 으로 올 수 있 을까요?잘못 한 것 과 없 는 것 은 사실 별 개의 일 이 니 자세히 고려 해 야 한다.
그래서 여기 서 제 가 드 리 는 건 의 는 사용 이상 을 간단하게 피 할 수 있다 면 피 하 는 것 입 니 다.
이상 통일 처리 건의
앞에서 언급 했 듯 이 전단 과 상호작용 할 때의 이상 처리,dubbo 인터페이스 에서 의 이상 처 리 는 모두 한 가지 언급 했다.실행 할 때 이상 한 건 의 를 통일 적 으로 처리 하 는 것(Checked 이상 은 프로그래머 에 의 해 강제로 처리 되 었 습 니 다).확장 해 보 세 요.또 어떤 이상 이 통일 적 으로 처리 되 어야 합 니까?어떤 차원 에서 통일 을 하 는 건 가요?나 는 라인 의 용 도 를 둘러싸 고 집합 처 리 를 할 수 있다 는 것 을 이해한다.흔히 볼 수 있 는 WEB 시스템 에서 다음 과 같은 몇 가지 스 레 드 가 실 행 됩 니 다.
Spring MVC:
@ExceptionHandlerpublic Object exception(Exception exception, HttpServletRequest request, HttpServletResponse response) { return ExceptionUtil.processException(request, response, exception, logger);
}
스 레 드 탱크:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(11, 100, 1, TimeUnit.MINUTES, //
new ArrayBlockingQueue(10000),//
new DefaultThreadFactory()) {
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
printException(r, t);
}
};
dubbo:
public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {
Result result = invoker.invoke(invocation); if(result.hasException()) {
printException(result.getException());
} return result;
}
종결 어
인터넷 에서 JAVA 의 이상 사용 과 가장 좋 은 실천 에 관 한 글 이 비교적 많 고 대부분이 이론 에 흐 르 며 실제 업무 에 대한 지도 적 의미 가 부족 하 며 흔히 볼 수 있 는 응용 장면,예 를 들 어 웹 층,dubbo 인터페이스 층 에 대한 실천 토론 이 부족 하 다.본 고 는 실제 응용 묘사 이상 사용 장면 을 결합 시 켜 공학 적 으로 가장 좋 은 이상 실천 탐색 을 전개 하고 자 한다.수준 이 제한 되 어 있 기 때문에 내용 에 이해 상의 편차 가 생 길 수 밖 에 없 으 니 비판 과 지적 을 바 랍 니 다.
클 라 우 드 안전(방패)콘 텐 츠 안전,인증 코드 등 서비스 무료 체험
더 많은 왕 이 기술,제품,운영 경험 공유 클릭 하 세 요.
안 드 로 이 드 TV 개발(4)[추천]4 단계 스마트 하드웨어 이상 사례 조사[추천]온라인 로그 집중 화 시각 화 관리:ELK
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.