try / catch / finally 문법 설명
`try`, `catch`, `finally` 문은 게임에서 오류를 점검하고 실행 시간 예외가 발생했을 때 해당 코드 블록을 테스트할 수 있도록 도와줍니다. 이를 사용함으로써 예외로 인해 게임이 종료되고 사용자에게 표준 오류 메시지를 보여주는 것을 방지할 수 있습니다. 대신 예외가 발생했을 때 어떤 조치를 취할지 관리해야 하므로 로그 파일을 저장하거나 게임을 정상적으로 종료하는 등의 처리가 필요합니다. 만약 아무 것도 하지 않는다면, 게임이 불안정해지거나 제대로 작동하지 않을 수 있습니다.
## 기본 구문
`try` 문은 아주 기본적으로 다음과 같은 형식입니다:
```gml
try {
<statement1>;
<statement2>;
...
}
그러나 예외를 처리할 방법이 없다면 try 문은 그다지 유용하지 않습니다. 그러므로 catch 문과 함께 사용하는 것이 일반적입니다.
try / catch 구문
try / catch 구문의 형식은 다음과 같습니다:
try {
<statement1>;
<statement2>;
...
} catch (<variable>) {
<statement1>;
<statement2>;
...
}
catch 블록은 try 블록에서 발생한 예외가 잡힐 경우 추가로 실행할 코드를 제공합니다. 다음은 이 예외에서 사용할 수 있는 구조체가 포함된 정보입니다:
{
message: "", // 예외에 대한 짧은 메시지
longMessage: "", // 예외에 대한 긴 메시지
script: "", // 예외가 발생한 위치 설명
stacktrace: ["", ""] // 예외가 발생한 스택 프레임 배열
}
간단한 예제
다음은 try / catch 문을 사용하는 간단한 예입니다:
var a = 0, b = 0, c = 0;
try {
c = a div b;
} catch (_exception) {
show_debug_message(_exception.message);
show_debug_message(_exception.longMessage);
show_debug_message(_exception.script);
show_debug_message(_exception.stacktrace);
}
finally 블록
예외가 발생했는지 여부에 상관없이 어떤 코드를 실행하고 싶다면 finally 블록을 추가할 수 있습니다. finally 구문의 형식은 다음과 같습니다:
finally {
<statement1>;
<statement2>;
...
}
모든 조합 사용
다음과 같이 다양한 조합이 가능합니다:
try/finallytry/catchtry/catch/finally
finally 블록 내에서는 break, continue, exit, return 문을 사용할 수 없으며, 이를 사용할 경우 컴파일러가 오류를 발생시킵니다.
중첩된 try/catch/finally
다음은 try/catch/finally를 중첩하여 사용하는 예입니다:
var a = 0, b = 0, c = 0;
try {
try {
c = a div b;
} finally {
++a;
}
} catch (_exception) {
++a;
show_debug_message(_exception.message);
show_debug_message(_exception.longMessage);
show_debug_message(_exception.script);
show_debug_message(_exception.stacktrace);
} finally {
show_debug_message("a = " + string(a));
}
정리
기본 GML 오류 메시지를 오버라이드하고 사용자 정의 핸들러 코드를 사용하려면 exception_unhandled_handler() 함수를 호출하여 사용할 수 있습니다. 이 런타임 함수는 게임에서 처리되지 않은 예외가 발생할 때마다 호출되는 사용자 정의 메서드를 제공합니다.
예제 코드
| 예제 번호 | 설명 | 코드 |
|---|---|---|
| 1 | 0으로 나누기 예외 처리 | gml<br>var a = 0, b = 0, c = 0;<br>try { c = a div b; } catch (_exception) { ... } |
| 2 | 정상 종료 처리 | gml<br>try { ... } finally { // 종료 처리 코드 } |
| 3 | 예외 발생 시 로깅 | gml<br>catch (_exception) { log_error(_exception.message); } |
이 문서가 try, catch, finally 문을 이해하는 데 도움이 되길 바랍니다. ```