'예외처리'에 해당되는 글 6

  1. 2010.07.27 예외 메세지를 제대로 보여주기
  2. 2009.12.18 잘못된 예외 처리로 인해 엉뚱한 에러 발생
  3. 2009.10.22 예외 추적
  4. 2009.08.14 시스템 Hangup 현상 분석
  5. 2009.05.17 MSXML 확인
  6. 2009.04.23 해서는 안되는 예외 처리 - 아무것도 안하는 경우

예외 메세지를 제대로 보여주기

에러메세지 앞부분에 자바 패키지명이 붙는 것을 없애자.
xxx.user.service.LoginException: 사용자 정보가 존재하지 않습니다.

메세지를 보아하니 Exception 클래스를 사용한 것 같은데 Exception#toString()을 그대로 쓴거 같다.
Exception#getMessage()를 이용하도록 수정하면 되겠네.

SpringMVC를 사용했으니깐  HandlerExceptionResolver 를 사용했을거고, 관련 설정을 확인해 본다.
모든 예외는 exception.jsp 로 이동함.(view를 찾을 때에는 viewResolver가 사용됨)
어라...제대로 처리하고 있는데...

예외를 생성한 곳을 보니
로그인을 처리하는 서비스에서 LoginException("사용자 정보가 존재하지 않습니다.") 을 발생시키고, 컨트롤러에서는 LoginException을 다시 생성해서 던지고 있다.

예외가 겹친 경우에도 위와 같은 메세지가 보인다.

exception.jsp에서 실제 예외를 찾아서 보여주자.

잘못된 예외 처리로 인해 엉뚱한 에러 발생

데이터 형식 nvarchar을(를) numeric(으)로 변환하는 중 오류가 발생했습니다.

갑자기 에러가 발생했다.
이런 에러가 예전부터 많이 나오긴 했었다.

문제가 없는 쿼리인데 에러가 발생한다.

로그를 보니 이상한 로그가 있다.
DEXTUploadException --> 데이터를 읽어오는 데 실패했습니다. 사용자와의 연결이 끊어졌거나 업로드를 중지했습니다.

예외를 잡아서 로그만 남기고 아무런 처리를 하지 않는다.
업로드컴포넌트에서 처리가 되지 않아서 DAO에서 쿼리문을 처리할때 pk2가 빈 문자열이 넘어온거 같다.
(웹요청에 대한 값을 Map에 넣었다가 getString(NAME) 같은 메서드로 처리하는데 NAME으로 된 값이 없으면 빈 문자열로 처리하게 되어 있음)

결국에는 아래와 같은 쿼리가 실행되었다.

업로드컴포넌트에서 에러가 난 이유는 디스크가 다 차서 더이상 용량이 남아 있지 않았다고 한다.

- 2010-02-08
다른 프로그램에서 동일한 에러 발생
전송을 했는데 화면이 정지하고 반응이 없었다고 함.
서버/네트워크 사용량이 많아서인지, 업체 PC 사양이 떨어져서 그런지는 불분명함.

예외 추적

10-15 15:13:43 ERROR com.xxx.client.connect.transmit.SendSOAPServiceImpl.proc(SendSOAPServiceImpl.java:343) - com.xxx.client.connect.transmit.SOAPException
10-15 15:13:43 ERROR com.xxx.client.connect.transmit.SendSOAPServiceImpl.proc(SendSOAPServiceImpl.java:344) -
10-15 15:13:43 INFO com.xxx.client.connect.transmit.SendServlet.doPost(SendServlet.java:89) - +++++++++++++++++++++null

예외가 어디서 발생했는지 로그에 쓸만한 정보가 없다.
로그를 기록하는 부분을 다음과 같이 변경한다.
10-22 09:19:59 ERROR com.xxx.client.connect.transmit.SendSOAPServiceImpl.proc(SendSOAPServiceImpl.java:343) - com.xxx.client.connect.transmit.SOAPException
10-22 09:19:59 ERROR com.xxx.client.connect.transmit.SendSOAPServiceImpl.proc(SendSOAPServiceImpl.java:344) -
10-22 09:20:00 ERROR com.xxx.client.connect.transmit.SendServlet.doPost(SendServlet.java:90) - error
com.xxx.client.connect.transmit.SOAPException
    at com.xxx.client.connect.transmit.ApplicationXMLHandler.validate(ApplicationXMLHandler.java:862)
    at com.xxx.client.connect.transmit.ApplicationXMLHandler$$FastClassByCGLIB$$3ea56c40.invoke(<generated>)
    ...
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
Caused by: java.security.NoSuchAlgorithmException
    at signgate.crypto.util.MDUtil.<init>(MDUtil.java:127)
    at com.xxx.client.connect.transmit.ApplicationXMLHandler.validate(ApplicationXMLHandler.java:849)
    ... 55 more

시스템 Hangup 현상 분석

Z건설사 시스템이 페이지가 열리지 않는 경우가 발생함.

[todo] 스레드덤프를 남겼지만 분석을 하지 못함.

어디에서 발생하는 에러인지 원인이 WAS인지 DB인지 파악도 안됨.

DBCP 설정에서 removeAbandoned, logAbandoned를 true로 두고 모니터링을 함.

예외처리도 정확하게 되었지만 Connection이 닫히지 않아 누수가 되고 있다.

[todo] 스레드덤프받아서 분석해보자.

MSXML 확인

 

<script type="text/javascript">
var vers = ["MSXML.DOMDocument", "MSXML2.DOMDocument"
	, "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument.4.0"
	, "MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.6.0"
	, "MSXML2.DOMDocument.7.0", "MSXML2.DOMDocument.8.0"];

for(var s in vers){	
	try{		
		new ActiveXObject(vers[s]);		
		document.write(vers[s] + " : Success <br />");	
	}catch(e){
		document.write(vers[s] + " : <span style='color:red;'>Fail</span> <br />");	
	}
}</script>

 

Microsoft XML 파서(MSXML)의 버전 목록

 

- IE 추가 기능 사용/사용 안함

 

- 추가 기능 관리는 인터넷 옵션 - 프로그램 에서도 관리가능함.

 

Internet Explorer를 사용하는 MSXML 버전을 확인하는 방법

IE에서 사용하는 MSXML 버전을 Filemon을 이용해서 확인하는 방법이다.

 

 

해서는 안되는 예외 처리 - 아무것도 안하는 경우

예외를 잡아서 아무것도 처리하지 않는 경우 예외가 발생했는지도 모르기 때문에 유지보수가 힘들다.
필요한 경우가 아닌 경우 절대 해서는 안되는 방식이다.
로그만 남기고 지나는 경우도 별반 다르지 않다.
사용자는 예외가 발생했는지 인지할수가 없다.
그냥 안된다고만 한다.
예외처리를 하더라도 로그는 남겨야 한다.(로그는 중앙집중적으로 한곳에서 남겨야 한다.)
에러났다고 하는데 원인을 파악할 수 없다.
  [todo] 적절한 예외 처리 를 정리할 것.