본문 바로가기
Android/Kotlin 기초

Kotlin 기초 문법 5 - 예외, 예외 처리, throw

by 2Plus 2020. 5. 22.

Photo by Clément H on Unsplash

 

예외 (Exception)

 예외는 프로그램이 실행되던 중에 예상하지 못한 상황이 발생하는 경우를 말한다. 숫자가 아닌 문자열 값을 Integer로 타입 변환하려 하거나, 실제로 할당되지 않아서 메모리에 없는 값을 참조하려 하는 등의 경우에 예외가 발생한다. 예기치 못하고 대처해두지 않은 예외가 발생하면 앱은 에러 메세지를 남기고 종료된다.

 

[Code]

 

 

[결과]

 

 

 일반 문자열을 Int로 변환하려 했을 예외가 발생하는 코드를 작성해보았다. "str.toInt()" 실행되면서 예외가 발생한 것을 확인할 있다. 로그를 확인해보면 main 쓰레드에서 NumberFormatException이 발생했다고 나온다. 밑에는 스택도 함께 출력되어 있는데, java.lang.Integer.parseInt에서 Int 값을 파싱하다가 죽었다는 있다. 밑으로 갈수록 호출한 상위 위치가 나오는데, main의 번째 (main.kt:3) 있다. main의 번째 줄은 "val num = str.toInt()" 여기가 예외의 시작점인 것을 있다.

 이런 식으로 예외가 발생하게 되면 어떤 예외가 어디에서 발생했는지, 그걸 호출한 곳은 어디인지를 파악할 수가 있다. 프로그램, 앱을 만들었을 예기치 못한 에러가 발생하면 이러한 로그를 확인하여 예외 처리라는 것을 통해 예외로 인해 앱이 강제 종료되는 것을 막고 대처할 있다. 예외 처리는 다음을 확인하자.

 

 

예외 처리

 우리가 Android 앱을 만들어서 구글 플레이에 올렸다고 생각하면, 사람들이 앱을 쓰다가 예외가 발생하여 앱이 죽어버리면 별점 테러도 당하고 사람들이 앱도 잘 쓰지 않게 될 것이다. 우리는 예외 처리를 통해 이러한 슬픈 일을 방지하고 앱이 잘 동작하도록 할 수 있다.

 


 예외 처리의 기본 문법은 위와 같다. try 블럭 안에 예외가 발생할 수 있는 코드를 작성하고, catch 블럭에 예외 발생시 처리할 코드를 작성하면 된다. finally 블럭은 예외 발생 여부와 관계 없이 항상 실행되는 코드를 작성하면 된다. catch 블럭의 경우는 예외를 받아서 처리하는데, Exception을 받으면 어떤 예외든 해당 catch 블럭이 받아서 수행하게 된다. 특정 예외를 받으려면 NullPointerException과 같이 구체적인 예외를 명시해주면 된다. try 블럭에서 여러 예외가 발생할 수 있는 경우, 각 예외에 대한 다른 처리가 필요하다면 각 Exception을 받는 catch 블럭을 연달아 작성하면 된다. 다음 예시를 통해서 확인해보자.

 

 

[Code 1]

 

 

[결과 1]

 

 

 앞서 예외가 발생해서 프로그램이 종료 되었던 코드를 예외 처리하여 작성한 예시이다. 예외가 발생하자 catch 블럭이 진행된 것을 확인할 있다. 가지 확인할 점은 예외는 언제 발생할 미리 없기 때문에 "val num = str.toInt()" 앞에 다른 실행되는 코드가 있었다면 코드가 실행되다가 실제 예외가 발생한 시점부터 catch 블럭이 실행된다는 것을 체크하기 바란다.

 

 Exception에는 다양한 것들이 담겨 있다. printStackTrace()를 호출하면 앞서 확인했던 예외 발생시 출력되던 콜 스택이 출력된다. 다른 것들은 필요하면 그때그때 찾아서 사용하면 된다.

 

 

[Code 2-1]

 

 

[결과 2-1]

 

 

[Code 2-2]

 

 

[결과 2-2]

 

 

 try 구문에서 발생한 예외에 따라 다르게 처리할 필요가 있는 경우에는 위와 같이 각각의 catch 블럭을 구현하여 사용하면 된다. 각 상황에 맞게 catch 블럭이 동작하는 것을 확인할 수 있다.

 

 

throw

 예외는 일반적으로 시스템에 의해 발생된다. 하지만 어떠한 로직을 직접 구현할 때, 필요한 경우 직접 예외를 발생시킬 수도 있다. 이때 사용하는 것이 throw이다. 쉽게 생각하면 예외를 던진다고 생각하면 된다.

 

 

 위의 예시와 같이 나눗셈을 하는 함수를 구현했다고 할 때, 나누는 값이 0이면 나눌 수가 없다. 이러한 경우에 throw Exception을 사용하면 직접 예외를 던질 수 있다. divide 함수를 호출하는 부분에서 try-catch-finally로 예외 처리를 수행해주면 된다.
 참고로 위는 예시를 위해서 작성한 것이며, 실제로 0으로 나누려고 하면 시스템에 의해 ArithmeticException이 발생하도록 되어 있다.

 

 

반응형

댓글