본문으로 바로가기

Exception 처리방법

category 프로그래밍/자바 2019. 1. 6. 19:22


Exception을 처리는 try~catch , throw ,throws 을 사용하는데

이것들을 사용하여 예외처리하는 방법 3가지에 대해 포스팅하겠습니다.


1. catch에서 특별한 처리를 해주지 않는다.(sanitize 방식)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MyTest {
 
    public static void main(String[] args) {                                            
        System.out.println(new MyTest().a());                                           
    }    
    
    public String a() {
        return "a"+b();
    }
    
    public String b() {
        return "b"+c();
    }
    
    public String c() {
        String dResult = null;
        try {
            dResult = d();
        }catch(Exception e)
        {
            
        }        
        return "c"+dResult;
    }    
    
    private String d() 
    {
        throw new IllegalArgumentException();                
    }
    
}
 
cs


결과)


=> abcnull

=> null은 string과 합치면 null 문자로 바뀐다.



2. 예외 전파


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MyTest {
 
    public static void main(String[] args) {                                            
        System.out.println(new MyTest().a());        
    }    
    
    public String a() {
        return "a"+b();
    }
    
    public String b() {
        return "b"+c();
    }
    
    public String c() {
        String dResult = "d";
        try {
            dResult = d();
        }catch(Exception e)
        {
e.printStackTrace();
            throw e; 
        }        
        return "c"+dResult;
    }    
    
    private String d() 
    {
        throw new IllegalArgumentException();                
    }    
}
cs


결과)


=> throw를 통해 호출한쪽으로 예외를 전파한다.

=> 이렇게 하면 어떤 원인으로 발생한지 알기 힘들다. 


3. 예외 원인을 담아서 전파(chainning 방식)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class MyTest {
 
    public static void main(String[] args) {                                            
        System.out.println(new MyTest().a());        
    }    
    
    public String a() {
        return "a"+b();
    }
    
    public String b() {
        String dResult = "c";
        try {
            dResult = c();
        }catch(Exception e)
        {            
            throw new CException(e); 
        }        
        return "b"+dResult;
    }
    
    public String c() {
        String dResult = "d";
        try {
            dResult = d();
        }catch(Exception e)
        {            
            throw new DException(e); 
        }        
        return "c"+dResult;
    }    
    
    private String d() 
    {
        throw new IllegalArgumentException();                
    }    
    
    private static final class DException extends RuntimeException
    {
        public DException(){
            
        }
        
        public DException(Throwable e) {
            super(e);
        }        
    }    
    
    private static final class CException extends RuntimeException
    {
        public CException() {
            
        }
        
        public CException(Throwable e) {
            super(e);
        }
    }    
}
 
cs


결과)


=> 원인을 담아서 전파하는 방식인데 왜 이렇게 해야 할까요?

만약 25번째줄 dResult = d(); 에서 만약 dResult = d() + e() + g(); 추가 되었다고 가정했을경우

예외를 던저줄때 그냥 throw new DException() 이렇게만 하면 원인은 어디서 일어났는지 알수 없다.

아래와 같이 그냥 에러가 어디서 발생되었는지만 나오게 된다.



그런데 왜 DException, CException 처러 예외를 여러개 만들어야 할까?

예를들어 로그인할때를 생각해보자

1. 사용자가 ID 자체를 안넣고 로그인하려고 할때

2. ID,PWD가 일치하는 정보가 없을때

...여러가지 예외가 있을수 있다.

그렇기 때문에 예외를 여러개 분리해서 처리해야한다.

분리해야지만 자기의 비즈니스에 집중할수 있다.(세분화시켜 비정상 흐름을 처리하기 위해서)



'프로그래밍 > 자바' 카테고리의 다른 글

[Java] Object 클래스란?  (0) 2019.01.08
[Java] final 이란?  (0) 2019.01.08
[JAVA] 자바 class 파일 실행방법  (1) 2018.12.31
Java에서 interface란?  (0) 2018.12.21
일반적인 인터페이스란?  (0) 2018.12.21