예외처리: 프로그램이 진행 중일 때, 의도하였거나 의도하지 않은 상황에 대해서 프로그램적으로 오류가 발생했을 때, 대처하는 방법
/// 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 문은 코드가 의도하지 않은대로 흘러가는 것을 방지할 수 있습니다.
동기 : 모든 코드가 순차적으로 실행되는 프로그램
비동기: 모든 코드가 동시다발적으로 실행해서, 순차적으로 보장을 할 수 없는 형태
- 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를 호출하고 이벤트를 발생시키는 객체
}
Flutter에서 widget과 Layout에 대해 공부할 예정