파파비의 블로그
C#) try, catch) 에러 핸들링 본문
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) 비주얼스튜디오의 디버깅 기능은 정말 최고인 것 같다
참고 동영상
'개발 > 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 |