Dart의 예외처리와 Dart의 비동기 프로그래밍(맛보기)

이동완·2024년 1월 23일
0

프로젝트 공부

목록 보기
4/6
post-thumbnail

1. 예외처리

예외처리: 프로그램이 진행 중일 때, 의도하였거나 의도하지 않은 상황에 대해서 프로그램적으로 오류가 발생했을 때, 대처하는 방법

많이 쓰이는 예외처리문은 try-catch문, finally문, on문, throw / rethrow문이 있다.

/// try-catch, finally
/// 가장 기본적이고 많이 쓰이는 예외처리문
void main(){
  int num = 10;

  try{
    /// 예외가 발생할 것으로 예상되는 코드
    print(10 ~/ 0);
  } catch(error,stack) {
    ///예외가 발생했을 떄 실행하고자 하는 코드
    print(error);
    print(stack);
  }finally{
    ///예외가 발생하던 하지 않았던, try문 / catch문 이후에 실행하고자 하는 코드
    print('예외처리문을 지나갔습니다.');
  }
  print('위의 에러 때문에 동작을 하지 않습니다.');
}

위의 코드처럼 try-catch와 finally문은 같이 묶여서 많이 사용됨

출력 결과

/// on : 특정 에러타입을 잡을 때 많이 사용됨
void main(){
  int num = 10;

  try{
    /// 예외가 발생할 것으로 예상되는 코드
    print(10 ~/ 0);
  } on UnsupportedError catch(e,s) {
    /// 0으로 나눴을 때 발생하는 에러를 처리
    print('~/ 해당 연산자는 0으로 나눌 수 없습니다.');
  } on TypeError catch(e,s){
    /// Null을 차용할 때 자주 접하는 에러
    print('Null 값이 참조 되었습니다.');
  }catch(e,s) {
    /// on문으로 설정한 에러 외에 다른 에러가 발생하면 이곳에서 실행된다.
    print('모르는 에러가 발생하였습니다.');
  }
  print('위의 에러 때문에 동작을 하지 않습니다.');
}

on문도 finally문 처럼 try-catch와 같이 사용되지만 특정 에러타입을 잡을 때 사용함

출력 결과

///throw / rethrow : 예외를 만들어서 던지는 문
void main(){
  int num = 10;

  try{
    /// 예외가 발생할 것으로 예상되는 코드
    throw Exception('Unknown Error');
  } on UnsupportedError catch(e,s) {
    /// 0으로 나눴을 때 발생하는 에러를 처리
    print('~/ 해당 연산자는 0으로 나눌 수 없습니다.');
  } on TypeError catch(e,s){
    /// Null을 차용할 때 자주 접하는 에러
    print('Null 값이 참조 되었습니다.');
  }catch(e,s) {
    /// on문으로 설정한 에러 외에 다른 에러가 발생하면 이곳에서 실행된다.
    print('모르는 에러가 발생하였습니다.');
  }
  print('위의 에러 때문에 동작을 하지 않습니다.');
}

throw 문은 코드가 의도하지 않은대로 흘러가는 것을 방지할 수 있습니다.

출력 결과

2. 비동기 프로그래밍(맛보기)

동기 : 모든 코드가 순차적으로 실행되는 프로그램
비동기: 모든 코드가 동시다발적으로 실행해서, 순차적으로 보장을 할 수 없는 형태

  • async / await / Future : 1회만 응답을 돌려받는 경우
  • async* / yield / Stream : 지속적으로 응답을 돌려받는 경우

비동기 프로그래밍은 함수로 진행이 됨

///async / await / Future 예시

void main(){
  Future<void> todo(int second) async {
    await Future.delayed(Duration(seconds: second));
    //Future 객체를 통해 지연을 시키고 특정 시간 뒤에 진행
    print('TODO Done in $second seconds');
  }
  todo(3);
  todo(1);
  todo(5);
}

출력 결과


동시에 실행됐지만 시간을 지연시킴에 따라 1초짜리 -> 3초짜리 -> 5초짜리 코드 순서대로 결과가 출력됨

///async* / yield / Stream
void main(){
  Stream<int> todo() async*{
    //기본적으로 끊기지 않아야 하기 때문에 while 문 사용
    int counter = 0;

    while(counter <= 10){
      counter++;
      await Future.delayed(Duration(seconds: 1));
      //지연을 시켜주기 위해 await 사용
      print('TODO is Running $counter');
      yield counter;
      //yield는 return 객체를 수시로 전달해 주는 역할
    }
    print('TODO is Done');
  }
  todo().listen((event) { });
  //todo를 호출하고 이벤트를 발생시키는 객체
}

출력 결과

3. 다음 주차

Flutter에서 widget과 Layout에 대해 공부할 예정

profile
이동완

0개의 댓글

관련 채용 정보