■ Exception
예외처리는 대부분의 언어에 있을 것이다.
예를들어 로그인 기능같은거 만들 때 프로그램에서 예상치 못한 상황에 대한 에러가 나는 걸 방지하기 위해
예외 상황을 일부러 만들어야한다.
로그인할 때 아이디는 보통 영어로 입력한다.
만약 한글로 입력해서 넘어가게 한다면 이때 예외처리를 해주어야 할 것이다.
영어로 입력해달라는 알림과 함께.
이거 외에도
예외 처리해야할 상황은 많다..
메모리, 파일을 찾을 수 없다거나.. 등등..
문법 에러 ( syntax error )
실행시 에러 ( runtime error )
논리 에러 ( 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()); // 예외처리할 때 출력될 메세지
}
}
결과 : 영어로 작성해주세요.
저런식으로 예외처리를 하면된다.
실제 로그인 기능 로직을 짤 때는 저런식으로 짜면 안된다.
보안 관련된 코드가 단 하나도 없기 때문이다.
그냥 간단하게 유효성 검사만 보여주는 코드다.
꼭 저렇게 커스텀하지 않아도
예외처리로 쓸 수 있는 내장메서드도 여러가지 있다.
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는 실행된다.