파파비의 블로그

C#) try, catch) 에러 핸들링 본문

개발/c#

C#) try, catch) 에러 핸들링

N. Dave 2020. 4. 2. 17:00
반응형

c#에서는 에러 핸들링을 어떻게 할까?

정답은 : try - catch 문이다.

 

다른 언어를 접해보신 본 사람들이라면,

쉽게 이해할 부분일 것 같다. 

 

1. 에러가 나올 법한 부분을 try 구문으로 감싸준다.

2. try 구문안에서 에러가 발생하면 catch에서 잡아준다.

3. catch 파라미터는

  - Exception만 와도 되고 (class)

  - Exception ex 처럼 객체를 넣어도 된다. 그럴 경우 ex에 에러에 대한 정보가 전달된다.

  - Exception은 모든 에러를 캐치한다.

  - IndexOufIndexOutOfRangeException와 같은 좁은 범위의 에러를 넣으면 해당 에러만 캐치한다.

  - catch 구문은 여러 개를 만들 수 있다. 

  - 앞에 특수한 에러들을 검토하고, 그 뒤에는 나머지 에러들을 검토하게끔 구문을 짤 수도 있다.

 

try

{

....

}

catch(Exception)

{

....
}

 

4. throw 라는 키워드

  - catch 구문에서 throw; 를 입력하면 해당 에러를 호출한 함수로 전달한다.

  - 상위 함수에서 에러를 핸들링하지 않으면 상위 함수를 호출한 상위 함수로 또 토스된다.

  - 계속 올라가서 main까지 가서도 핸들링이 되지 않으면 프로그램은 crush 된다.

  - catch 구문에서 throw를 사용하는 방법은 3가지가 있다.

   1) throw;

      - 발생한 에러 객체를 전달한다.

      - 전후 콜스택이 모두 포함된 채로

   2) throw 에러객체;

      - 발생한 에러 객체를 전달한다.

      - 에러 이후의 콜스택만 포함된 채로

   3) throw new ApplicationException();

      - 새로운 에러객체를 만들어서 상위로 던지는 것이다. 

      - throw new ApplicationException(발생한 에러 객체.message, 발생한 에러 객체);

      - 이렇게 새로운 객체를 만들 때, 메시지를 포함시킬 수 있으며,

      - 실제로 발생한 에러를 내부에러로 포함시켜서 전달할 수 있다.

      - 새로운 객체를 만들어서 보낼 때는 내부에러로 실제 에러 객체를 포함하는 것이 권장된다.

 

 

5. finally 키워드

 

try{}

catch{}

finally{}

 

이런 순서로 finally 키워드가 쓰인다.

 

- finally는 필수적인 구문은 아니다.

- catch에서 에러가 잡힌 뒤에 실행되는 부분이다.

- "finally" 안쓰고 그냥 catch 구문 뒤에 원하는 구문을 쓰는 것과 무엇이 다른가?

    >> 만약 catch에서 throw를 사용하여 상위 함수로 에러를 토스하면 그 이하의 구문들은 실행되지 않는다.

    >> but, finally를 사용하면, 토스를 하더라도, finally 부분은 실행된 뒤에 상위 함수로 토스된다.

 

 

cf) 비주얼스튜디오의 디버깅 기능은 정말 최고인 것 같다

 

참고 동영상

https://www.youtube.com/watch?v=zr9fXAOGC3s

반응형

'개발 > c#' 카테고리의 다른 글

C#) private, protected, public 접근 제한자 // sealed 상속 제한 예약어  (0) 2020.04.03
C#) yield return  (0) 2020.04.02
C#) break와 continue  (0) 2020.04.02
C#) switch문 이해하기  (0) 2020.04.02
C#) 값형식과 레퍼런스형식  (0) 2020.04.01
Comments