Dart 예외처리 총집합 assert/try/catch/finally/Stack Trace

HyunHo Shin·2023년 6월 5일
0

프로그램 동작시 발생하는 버그를 좀 더 체계적으로 대응하기 위한 방법이 Exception handling 입니다. 이번 글에서는 Dart의 Exception handling을 알아보도록 하겠습니다.

Exception(예외)란?

  • Exception이란 프로그램의 정상적 흐름을 방해하는 이벤트를 말한다.
  • 대표적인 예로, 숫자를 0으로 나눌 때 발생하는 DivisionByZero Exception이 있다.
  • Dart는 Exception을 처리하는 방법으로 Assert, try-catch-finally,stackTrace를 활용합니다

Assert

  • 조건이 거짓일 경우 프로그램을 실행 중단하는 명령어
  • 오직 Debug 중일 때만 실행된다. 배포 코드에서는 프로그램에 영향을 주지 않음
assert(condition, optionalMessage);

void main() {
  var i = 5;
  assert(i > 0, 'A positive integer is required.');

}

Throw

  • thow는 프로그램의 실행을 멈추는 코드이다.
  • 단, assert와 달리 에러의 확인을 직접 하지는 않는다.
	// assert는 에러를 확인하는 코드를 내장하고 있다.
  assert(i > 0, 'A positive integer is required.');
	// 이와 반대로 throw는 에러를 확인하는 코드를 가지고 있지 않다. 그냥 프로그램의 실행만 멈춘다
	throw Exception('Negative number: $num');
  • 때문에 throw는 종종 if나 switch 문과 함께 사용합니다.
void main() {
  var num = -5;

  if (num < 0) {
    throw Exception('Negative number: $num');
  }
}

Try-catch-finally

  • try - catch -finally는 Exception 발생시 처리 방법을 설명하는 코드입니다
  • try 코드 내부에는 Exception이 발생할 가능성이 있는 코드를 추가합니다
  • catch 코드에는 각각의 Exception별 프로그램이 취해야 할 행동을 추가합니다
  • finally 코드에는 코드가 정상 실행 되던, exception이 실행 되던 프로그램이 마지막으로 항상 실행해야 할 행동을 추가합니다
void main() {
  try { // try 코드 내부에는 Exception이 발생할 가능성이 있는 코드를 추가합니다
    var a = 7;
    var b = 0;
    print(a ~/ b); 
  } catch(e, s) { // catch 코드에는 각각의 Exception별 프로그램이 취해야 할 행동을 추가합니다
    print('An exception occurred: $e');
    print('Stack trace: $s');
  } finally {  // finally 코드에는 프로그램이 마지막으로 항상 실행해야 할 행동을 추가합니다
    print('This is the finally block');
  }
}

Stack Trace

  • 마지막으로 Stack Trace를 알아보도록 하겠습니다
  • Exception의 원인은 꼬리에 꼬리를 문 경우가 많습니다.
  • 예를 들어 서로 연결된 함수 functionA, B ,C가 있다고 하겠습니다. function A는 functionB를 실행하고 functionB는 functionC를 실행합니다. [ functionA → functionB → functionC]
  • 만약 우리가 functionA를 호출했을 때 Exception이 발생한다면, 우리는 functionA가 원인이라 생각할 수 있지만. 실제 원인은 functionC일 수도 있습니다.
  • StackTrace는 이러한 사실을 코더에게 알려주기 위해 함수의 호출을 추적(Trace)한 기록입니다. 위와 같은 경우의 StacTrace는 다음과 같을 것입니다.
at functionC(file.dart:line_number) // 일반적으로 문제의 원인은 첫줄에 있습니다. 
at functionB(file.dart:line_number) // 하지만 종종 다른 줄에 있는 경우도 있으니
at functionA(file.dart:line_number) // 실제로는 전부 확인해 보아야 합니다.
  • StackTrace를 실제 자주 볼 수 있는 곳은 try-catch-finally 블록입니다.
void main() {
  try { 
    var a = 7;
    var b = 0;
    print(a ~/ b); 
  } catch(e, s) { // s는 stacktrace를 의미합니다.
    print('An exception occurred: $e');
    print('Stack trace: $s');
  } finally {  
    print('This is the finally block');
  }
}
profile
관심사가 다양한 사람

0개의 댓글