공부 일기/TIL

Flutter 창업반 3주차 TIL1 - 예외처리, 오류

oosuhada 2024. 11. 8. 19:35

 

11/4 - 월

Flutter 창업반 3주차 TIL1

 

예외처리

 

예외를 처리해 주지 않으면 프로그램이 종료되지만, 처리해 주면 프로그램이 정상적으로 실행됨

모든 종류의 예외는 Exception 클래스를 상속 받아서 구성

Exception 클래스를 상속 받지 않고 Exception 클래스로 객체를 생성해 줘도 됨

그러나 그 예외가 어떤 타입의 예외인지 알기 어렵기 때문에 예외의 타입을 명확히 하기 위해서 Exception 클래스를 상속 받은 클래스로 객체를 생성함

 

  1. 예외종류. Dart 가 미리 정의해 둔 예외

 

1) DeferredLoadException 

- 필요한 시점에 로드되도록 설정한 라이브러리가 로드되지 못 했을 때 발생

- 예시 DeferredLoadException(String message) 

-> message 에 예외에 대한 설명을 써주면 됨

 

2) FormatException

- 데이터가 처리 가능한 형태가 아니어서 데이터를 처리하기 어려울 때 발생함

- FormatException([String message = "", dynamic source, int? offset])

-> message : 예외에 대한 설명, source : 예외가 발생한 원인이 되는 것

 

3) IOException

- 입출력 관련 동작을 하는 중에 발생하는 오류

- IOException() 매개변수로 메시지를 받지 않음

- IOException 상속받아서 FileSystemException, HttpException, ProcessException, SignalException, SocketException, StdinException, StdoutException, TlsException, WebSocketException 오류 발생

 

4) OSError

- 운영체제 레벨에서 발생하는 오류

- OSError([String message = "", int errorCode = noErrorCode])

 

5) TimeoutException

- 비동기 결과를 기다리는 동안 특정 시간이 초과되었을 때 발생

- TimeoutException(String? message, [Duration? duration])

 

  1. 예외종류. 사용자가 직접 정의한 예외

 

Dart 가 정의한 예외들이 마음에 안 들어서 커스텀하고 싶을 때 사용

Exception 클래스를 상속 받아서 새로운 예외 클래스를 생성

 

- Dart 가 정의한 예외들이 마음에 안 들어서 커스텀하고 싶을 때 사용

- Exception 클래스를 상속 받아서 새로운 예외 클래스를 생성

 

class AgeException implements Exception {

  final String message;

  

  AgeException(this.message);

}

// 상속 받을 때 implements 키워드를 사용

 

1) try - catch

- 발생한 예외를 처리하기 위한 경우 try, catch, on, finally 를 사용 (보고 예외처리 구문이구나 파악할 수 있음)

- try 의 코드 블록 실행 중에 예외가 발생하면 try 의 코드 블록에 있는 뒷 코드들은 실행되지 않음

- try 의 코드 블록 실행 중에 예외가 발생했을 때 catch로 실행할 코드를 넣음

- catch는 try 의 코드 블록에서 예외가 발생하지 않으면 실행되지 않음

- try와 catch는 한쌍, 반드시 있어야 하고 catch는 개수 제한 없지만 한개 이상이어야 함

 

catch (예외) {

print(예외);

}

 

2) on

- on은 try 의 코드 블록에서 발생할 수 있는 예외 중 특정 타입의 예외를 다루는 부분

- on 단독으로 사용할 수 없고, catch 와 항상 같이 써야

- 예외 타입이 특정되기 때문에 catch 에 객체가 전달되었을 때 그 객체를 가지고 할 수 있는 동작이 더 많음

 

on IOException catch (예외) {

// IOException 이 발생했을 때 실행할 코드

}

 

3) finally

- finally, 예외 발생 여부와 상관 없이 실행할 코드를 넣는 부분

- finally는 try, catch 를 모두 거친 후 마지막에 실행

 

finally {

// 예외 처리 후 실행할 코드

}

 

4) throw

- 예외를 의도적으로 발생시키기 위한 경우 throw를 사용

- throw 를 통해 발생된 예외는 try, catch, on 으로 처리할 수 있음

 

void printAge(int age) {

  if (age < 0) {

    throw Exception('나이는 0 이상이어야 해요 !');

  }

  print(age);

}

 

void main() {

  try {

    printAge(-8);

  } catch (e) {

    print(e);

  }

}

 

 

오류 

 

오류는 주로 프로그램 외부의 환경이나 시스템 레벨에서 발생하는 심각한 문제

모든 종류의 오류는 Error 클래스를 상속 받아서 구성

발생하면 프로그램이 정상적으로 실행되기 어려움

 

  1. Dart 가 미리 정의해 둔 오류

 

1)  ArgumentError 

- 허용되지 않는 인자를 함수에 전달했을 때 발생. 혀용되지 않은 매개변수

 

2) AssertionError

- assert() 문의 매개변수에 전달하는 조건문이 거짓일 때 발생

- assert() 에서 매개변수에 넣은 조건문이 참이면 정상적으로 실행이 계속 되고, 조건문이 거짓이면 예외 (AssertionError) 를 발생

- 논리적인 오류를 잡아낼 때 사용

- assert([조건문]); or assert([조건문], '[메시지]'); 형태

 

3) RangeError

- 허용되지 않는 범위의 값이 매개변수로 전달되었을 때 발생

- ArgumentError 클래스를 상속 받은 클래스

 

4) IndexError

- 허용되지 않는 범위의 Index 를 사용했을 때 발생

- RangeError 클래스를 상속 받은 클래스

 

5) NoSuchMethodError

- 함수메서드 를 실행할 수 없는 경우에 발생

Cf. 복습 - 함수는 객체에 의존적이지 않고, 메서드는 객체에 의존적

호출할 때 함수 는 객체를 통하지 않지만, 메서드 는 객체를 통한다

 

6) OutOfMemoryError

- 프로그램이 시스템 메모리를 너무 많이 써서 더 이상 할당할 수 없을 때 발생

- 메모리가 부족할 때 발생

 

7) StackOverflowError

- 스택 오버플로우 : 메모리 공간 중 하나인 스택 (Stack) 영역이 수용 가능한 범위를 넘어가는 현상

- 메모리 공간은 4가지로 구성: 프로그램에서 실행할 코드를 담는 코드 (Code) / 전역 변수정적 변수 를 담는 공간 데이터 (Data) / 개발자가 직접 할당하고, 해제할 수 있는 동적인 공간 (Heap) / 지역 변수매개변수 를 담는 공간 스택 (Stack)

- 코드 (Code)와 데이터 (Data)는 프로그램 시작부터 종료까지 메모리에 계속 남아있음

- (Heap)은 프로그램 실행 중에 크기가 결정, 스택 (Stack)은 변수가 속한 코드 블록의 실행이 끝나면 메모리에서 사라짐

 

8) StateError

- 객체의 현재 상태로는 특정 동작 수행이 불가능한 경우에 발생

 

List<int> numbers = [];

print(numbers.first);

// first 는 List 의 첫번째 요소를 반환하는 역할을 하는데, numbers 는 빈 List 이기 때문에 반환할 첫번째 요소가 없음

 

9) TypeError

- 예상한 타입과 타입이 맞지 않은 경우에 발생

 

String b = '2';

print(b as double);

// String 을 double 로 바꿀 수 없어서 TypeError 가 발생

 

10) UnimplementedError

- 구현되지 않은 메서드나 기능을 ‘호출’했을 때 발생

 

class Dog {

  void bark() {

    print('멍멍 !');

  }

}

 

void main() {

  Dog dog = Dog();

  dog.run();

}

// Dog 클래스에는 run() 메서드가 없음. 정의되지 않음.

 

11) UnsupportedError

- 객체를 통해 ‘실행’될 수 없는 동작일 때 발생 (호출은 할 수 있음)

 

const numbers = [1, 2, 3];

numbers.add(4);

//numbers 는 const 변수이기 때문에 요소를 추가할 수 없음

 

 

  1. 사용자가 직접 정의한 오류

- Error 클래스를 상속 받아서 새로운 오류 클래스를 만들면 됨

 

 

  1. 예외 vs 오류

 


예외 오류
발생원인 코프로그래밍 로직 문제
(ex. 논리적 오류, 비정상적인 입력)
주로 시스템 문제 
(ex. 메모리 부족)
예상 가능여부 O 예상할 있음 X 예상할 없음
처리 가능여부 O try-catch 통해 처리 가능 X 발생을 예상할 없기 때문에 처리할 없음
실행 가능여부 O 처리해 주면 프로그램이 정상적으로 실행 X 발생하면 프로그램이 종료