본문 바로가기
Flutter/Dart 입문

[Dart] 13. 예외처리 - try, catch 구문

by Couldi 2021. 11. 12.
반응형

21. 11. 12.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. 예외처리(Exceptions Handling)란?
2. 예외처리 방법
    - try, catch 구문

 

1. 예외처리(Exceptions Handling)란?

https://ko.wikipedia.org/wiki/%EC%98%88%EC%99%B8_%EC%B2%98%EB%A6%AC

 

예외 처리 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

'예외처리라고 해서 뭔가 굉장히 어려운 개념인가보다.' 라고 생각하겠지만 전혀 아니다. 코드를 작성해 실행하다보면 우리는 수 많은 에러에 마주한다. 이 에러를 처리하는 방법에 대한 내용이 예외처리이다.

 

예외처리는 에러를 처리하는 방법이다.

 

코드를 작성하고, 실행해보면 어디에 에러가 있다고 실행이 안되고, 그러면 해당 에러를 찾아 수정하고 실행될때까지 반복하면 되는거지, 뭐하러 그 에러를 따로 처리하는 법까지 알아야하나 싶다. 하지만 모든 일에는 이유가 있듯, 예외처리를 해줘야 하는 경우가 있으니 알아야 하는 것 아니겠는가.

 

에러가 나더라도 프로그램이 동작해야한다.

예외처리하는 방법이 없다면, 에러가 발생할때 마다 프로그램 전체가 멈춰야하는 불상사가 생긴다. 잘 작동하던 앱에 신규 기능을 추가했는데 거기에 있는 정말 사소한 오류로 앱 전체의 작동이 멈춰버린다면? 막막한 일이다. 그래서 예외처리는 에러가 날 수 있는 부분에 미연의 방지 작업을 해둠으로, 에러가 나면 해당 부분의 코드 작동만 없던 일로 하고, 나머지 코드들은 정상적으로 실행되게 만들어 주는 것을 기본으로 한다.

여기까지 끄덕거리며 내용을 이해했다면, 의구심이 생겨야 정상이다.

'아니.. 에러가 날 수 있는 부분이 있으면 그부분에 에러가 안나게끔 코드를 수정하면 되는거 아냐? 에러가 날 수도 있는 걸 알면 고쳐야지 왜? 고칠 생각을 안하고 실행안된걸로 되게끔 작업을 해야하지??'

에러가 나는게 내 잘못이 아닐 수 있다.  

우리가 마주하는 모든 에러가 우리의 잘못은 아니다. 대부분의 에러가 작성한 사람이 코드를 이상하게 짜서 발생하는 문제이긴 하지만, 매번 그렇지는 않다. 우리의 문제가 아니라 남의 문제, 혹은 기기의 문제때문에 에러가 발생할 수 있는 상황이 있다.

예를 들어 API를 통해 데이터를 받아와 작동해야하는 기능이 있다고 하자. 이런 경우 API는 보통 외부 서비스를 이용하게되는데 해당 API 서버가 맛이 가서 데이터가 안들어온다던지, 보내주는 데이터의 타입이 변경이 된 경우를 생각해보자.

이건 내 잘못이 아니다. 난 코드를 제대로 작성했고, 보내주는 데이터에 맞게끔 작성을 다해 놨는데 그놈의 API가 맛이 가서 에러가 생기는 거다. 

아니면 핸드폰의 조도센서나 자이로 센서를 이용해 데이터를 받아 동작하는 프로그램을 만들었는데, 핸드폰의 센서가 맛이가서 데이터가 전부 null로 들어온다면?

한술 더 떠 이런 에러부분들이 내 전체 프로그램에서 동작하는 수 많은 기능 중 아주 사소한 일부의 기능만을 담당한다면, 내 잘못도 아닌 문제로 내 프로그램이 에러를 띄우며 동작하지 않는 경험을 해야한다.

 

 2. 예외처리 방법

https://dart.dev/guides/language/language-tour#exceptions

 

A tour of the Dart language

A tour of all the major Dart language features.

dart.dev

방법은 많다. 하지만 여기서는 가장 기초적이고 단순한 try, catch구문 만을 다룰 것이다. 나머지에 대해 알아야 겠다는 생각이 들면 위의 링크 내용을 읽어보면 된다.

try, catch구문

try {
    // 여기에 에러가 날지도 모르는 코드를 적는다.
} catch(e) {
    // e 에는 발생한 에러 메세지가 담긴다.
    // 여기에는 에러가 발생했을때 실행시킬 코드를 적는다.
}
  • try구문은 에러가 날 '가능성'이 있는 코드를 적는다. 에러가 나지 않으면 정상작동하고, 에러가 나면 없던 코드 취급을 해준다. 혼자 사용할 수는 없다. try구문을 사용했으면 뒤에 on, catch, finally 구문 중 하는 꼭 와줘야한다.
  • catch구문에는 에러가 났을 때 실행시킬 코드를 적는다. 일반적으로 터미널에 에러메세지를 띄우는 용으로 많이 사용한다. catch 다음에 (e)를 포함해야하는데  e에는 에러 메세지의 내용이 담긴다. 일반적으로 print문과 활용해 에러메세지를 남기는 용도로 사용한다.

예제

try {
    Position position = await Geolocator()
        .getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

    latitude = position.latitude;
    longitude = position.longitude;
} catch (e) {
    print(e);
}

 

위 처럼 사용한다. Geolocator를 이용해 현재 위치에 대한 정보를 가져오고자 하는 코드이다. 정상적으로 작동하면 문제 없겠지만, 기기의 GPS권한 문제라던지, 센서가 맛이 갔다던지 등의 문제로 위치정보를 가져오지 못할 수 있다. 그런 미연의 상태를 방지하기 위해 try, catch구문을 사용하면 에러가 생기더라도 프로그램이 멈추지 않고 동작하면서, 어떤 에러때문에 코드가 실행이 안된 건지 확인 할 수 있다.

 

프로그래밍을 처음 공부중이라면 다른 예외처리를 굳이 찾아서 공부할 필요는 없다. try, catch 구문만으로도 어지간한 예외처리 대부분이 가능하다.

반응형

'Flutter > Dart 입문' 카테고리의 다른 글

[Dart] 15. 삼항연산자 - Ternary Operator  (0) 2021.11.15
[Dart] 14. 형변환 - Casting  (0) 2021.11.12
[Dart] 12. final vs. const  (7) 2021.11.06
[Dart] 11. Null Safety  (0) 2021.11.04
[Dart] 10-2. 클래스(class)  (4) 2021.10.27

댓글