dart - 예외처리

jokil·2023년 12월 11일
0

플러터

목록 보기
7/15

■ Exception
예외처리는 대부분의 언어에 있을 것이다.

예를들어 로그인 기능같은거 만들 때 프로그램에서 예상치 못한 상황에 대한 에러가 나는 걸 방지하기 위해

예외 상황을 일부러 만들어야한다.

로그인할 때 아이디는 보통 영어로 입력한다.

만약 한글로 입력해서 넘어가게 한다면 이때 예외처리를 해주어야 할 것이다.

영어로 입력해달라는 알림과 함께.

이거 외에도

예외 처리해야할 상황은 많다..

메모리, 파일을 찾을 수 없다거나.. 등등..

  • 에러의 종류
  1. 문법 에러 ( syntax error )

  2. 실행시 에러 ( runtime error )

  3. 논리 에러 ( logic error )

예외처리

문법을 보자


// 예외처리 문법 
try {
 // 에러가 날 것 같은 코드 작성
  } catch(e) {
 // e : 에러의 정보를 담고있는 객체
}
문법은 이렇다.

예제 코드로보자.

class User {
  String username; // 아이디, 패스워드 필드 생성
  String password;

  User({required this.username, required this.password});
}

class LoginException implements Exception { // LoginException이라는 커스텀 익셉션을 만듦
  String cause; // cause 뜻 : 원인
  LoginException(this.cause); // 원인을 인자로 받음

  
  String toString() { // toString을 써야 if문 안에 있는 LoginException으로 넘긴 문자열을 표현해줌.
    return cause;
  }
}

void loginUser(User user) {
  // 정규 표현식을 사용하여 한글인지 확인
  RegExp hangle = RegExp(r'[가-힣]');
  if (hangle.hasMatch(user.username)) { // hasMatch는 boolean값으로 반환함. 문자열이 정규 표현식과 일치하는지 여부 판단.
    throw new LoginException('영어로 작성해주세요.'); // LoginException함수에 문자열 인자를 넘김 그걸 toString이 표현시켜줌.
  } else {
    print('로그인 성공');
  }
}

void main() {
  User user = User(username: '한글', password: 'password123');

  try {
    loginUser(user); // 예외 검사 하는 함수
  } catch (e) {
    print(e.toString()); // 예외처리할 때 출력될 메세지
  }
}

결과 : 영어로 작성해주세요.

저런식으로 예외처리를 하면된다.

실제 로그인 기능 로직을 짤 때는 저런식으로 짜면 안된다.

보안 관련된 코드가 단 하나도 없기 때문이다.

그냥 간단하게 유효성 검사만 보여주는 코드다.

꼭 저렇게 커스텀하지 않아도

예외처리로 쓸 수 있는 내장메서드도 여러가지 있다.


  • rethrow로 에러 처리를 미룰 수 있다.
void main() {
  User user = User(username: '한글', password: 'password123');

  try {
    loginUser(user); // 예외 검사 하는 함수
  } catch (e) {
   rethrow; // 예외처리 미룸.
  }
}

rethrow를 쓰고 실행 시키면 이렇게 터진다..

  • 항상 해야하는 처리에는 finally를 쓰면 된다.

  • 특정 예외를 캐치해야할 때는 on을 붙이면 된다.

try {
  loginUser(user); // 예외 검사 하는 함수
} on LoginException {
 print('LoginException 발생'); // 예외처리할 때 출력될 메세지
} finally {
  print('무조건 실행되는 코드! 나는 finally');
}

결과 :

로그인 성공
무조건 실행되는 코드! 나는 finally

한글이든 영어든 무조건 finally는 실행된다.

profile
주니어 개발자에서 점핑점핑

0개의 댓글