예외
예외(Exception) 이란?
예외란 간단히 말해 오류 메시지 입니다. 코드를 작성하고 컴파일하거나 코드 실행 시 어떠한 문제가 발생했다면 예외가 발생하게 됩니다.
예외 메시지는 일반적으로 다음과 같은 형태입니다.
예외 이름: 예외 설명
코드 종류:코드 파일:코드 줄
예를 들자면
BadEntityException: That entity (UUID 123450eab-ase2-50fa-3029-2739febf2013) does not exist.
<<main code>>:main.ms:92
와 같은 형식이죠.
try-catch 문
일반적으로 오류가 발생하면 스크립트가 중지되고 메시지가 표시됩니다. 그렇다면 오류가 발생했을 때 특정한 작업을 하게 하려면 어떻게 해야 할까요? try-catch 문을 사용하면 특정한 오류가 발생하면 특정한 코드를 실행하게 할 수 있습니다.
예제 1.
try {
pkill('EATSTEAK')
} catch(PlayerOfflineException @e) {
msg('오프라인입니다.')
}
결과: 만약
EATSTEAK
플레이어가 온라인이라면 그 플레이어를 죽이고, 오프라인이라면오프라인입니다
라는 메시지를 표시합니다.
만약 try {}
안에 있는 코드에서 예외가 발생한다면 이후의 catch(예외종류 @예외변수) {}
부분의 코드가 실행됩니다. 예외 종류에 맞는 예외의 경우에만 해당 코드가 실행되며, 코드 안에서는 주어진 예외변수에서 예외의 정보를 확인할 수 있습니다.
예외 정보의 키 값은 다음과 같습니다.
- classType: 예외의 종류입니다.
- message: 예외 설명입니다.
- stackTrace: 예외의 자세한 오류 정보입니다.
- id: 예외가 일어난 펑션이나 클로저의 이름 등입니다.
- file: 예외가 일어난 파일입니다.
- line: 예외가 일어난 줄입니다.
예외 2.
try {
pkill('EATSTEAK')
@array = array()
array_get(@array, 10)
} catch(PlayerOfflineException @e) {
msg('오프라인입니다.')
} catch(IndexOverflowException @e2) {
msg('인덱스 예외입니다.')
}
결과: 만약
EATSTEAK
플레이어가 온라인이라면 그 플레이어를 죽이고, 오프라인이라면오프라인입니다
라는 메시지를 표시합니다. 오프라인이 아니라면인덱스 예외입니다.
라는 메시지도 표시됩니다.
여러 종류의 예외를 종류별로 감지할 수도 있습니다.
예외 종류
예외는 확장기능에 의해 추가될 수도 있습니다. 여기의 목록은 기본 예외에 대해 정리하였습니다.
ByteArrayReadOnlyException
바이트 배열에서 복사한 배열에 무언가를 쓰려고 할 때 발생합니다.
추가된 버전: 3.3.1
BadEntityException
주어진 엔디티 id 에 해당하는 엔디티가 존재하지 않을 때 발생합니다.
추가된 버전: 3.3.1
BadEntityTypeException
주어진 엔디티 종류가 올바르지 않을 때 발생합니다.
추가된 버전: 3.3.1
BindException
이벤트를 bind()
할 때나 이벤트 관련 오류에서 발생합니다.
추가된 버전: 3.3.1
CastException
주어진 값이 원하는 값으로 변환될 수 없는 값일 경우 발생합니다.
추가된 버전: 3.3.1
EnchantmentException
주어진 아이템에 주어진 인첸트를 사용할 수 없는 경우 발생합니다.
추가된 버전: 3.3.1
Error
아주 중요한 오류가 발생했을 때 발생합니다. Error 예외를 catch 하는 것은 추천되지 않습니다.
추가된 버전: 3.3.1
EventException
이벤트 대상에 관한 오류가 발생하였을때 발생합니다. 이는 대부분 커맨드헬퍼의 오류라기 보다는 서버 자체의 오류일 경우가 있습니다.
추가된 버전: 3.3.2
Exception
일반적인 예외입니다. 모든 예외는 이 예외를 상속합니다.
추가된 버전: 3.3.1
FormatException
펑션이 특정한 형식의 문자열을 요구했지만 그러한 값이 주어지지 않았을 때 발생합니다.
추가된 버전: 3.3.1
IOException
파일이 읽거나 쓸 수 없을 때 발생합니다.
추가된 버전: 3.3.1
IllegalArgumentException
주어진 인수가 올바르지 않을 때 발생합니다.
추가된 버전: 3.3.1
IncludeException
include 에 오류가 있을 때 발생합니다.
추가된 버전: 3.3.1
IndexOverflowException
이 예외는 주어진 인덱스가 대상 배열의 인덱스보다 클 때 발생합니다.
추가된 버전: 3.3.1
InsufficientArgumentsException
펑션이 요구하는 인수 개수와 주어진 인수 개수가 맞지 않을 경우 발생합니다.
추가된 버전: 3.3.1
InsufficientPermissionException
펑션을 사용하는 사용자가 해당 펑션을 사용할 권한이 없을 때 발생합니다.
추가된 버전: 3.3.1
InvalidPluginException
외부 플러그인을 사용하는 펑션에서 대상 플러그인이 존재하지 않거나 로드되지 않으면 발생합니다.
추가된 버전: 3.3.1
InvalidProcedureException
선언되지 않은 프로시저를 호출할 때나 프로시저 이름이 올바르지 않을 때 발생합니다.
추가된 버전: 3.3.1
InvalidWorldException
주어진 월드가 존재하지 않을 때 발생합니다.
추가된 버전: 3.3.1
LengthException
펑션에서 원하는 인수의 길이 조건을 만족하지 않을 때 발생합니다.
추가된 버전: 3.3.1
NotFoundException
데이터를 요구했지만 존재하지 않을 때 발생합니다.
추가된 버전: 3.3.1
NullPointerException
요구한 값이 null 이 아니지만 null 이 주어졌을 때 발생합니다.
추가된 버전: 3.3.1
OAuthException
OAuth 시스템에 문제가 발생했을 때 발생합니다.
추가된 버전: 3.3.2
PlayerOfflineException
주어진 플레이어가 온라인이 아니거나 작업을 실행하는 실행자가 플레이어가 아닌데도 작업 실행자가 플레이어이길 요구하는 작업을 할 때 발생합니다.
추가된 버전: 3.3.1
PluginChannelException
이미 등록된 플러그인 채널을 등록하거나 등록되지 않은 플러그인 채널을 등록 해제할 때 발생합니다.
추가된 버전: 3.3.1
PluginInternalException
플러그인이 로드되었지만 불러오는 데 실패했을 경우 발생합니다. 이는 대부분 플러그인 내부 문제입니다.
추가된 버전: 3.3.1
RangeException
펑션이 주어진 범위의 숫자를 요구했지만 해당 범위에서 벗어났을 때 발생합니다.
추가된 버전: 3.3.1
ReadOnlyException
필드가 읽기 전용이지만 쓰기 작업이 실행되었을때 발생합니다.
추가된 버전: 3.3.1
SQLException
SQL 관련 오류가 발생했을 때 발생합니다.
추가된 버전: 3.3.1
ScoreboardException
스코어보드 관련 오류가 발생했을 때 발생합니다.
추가된 버전: 3.3.1
SecurityException
스크립트가 쓰거나 읽는 위치가 시스템에서 허용되지 않은 위치일 때 발생합니다.
추가된 버전: 3.3.1
ShellException
쉘 예외가 발생했을때 발생합니다.
추가된 버전: 3.3.1
StackOverflowError
스택 오버플로우 에러가 발생했을때 발생합니다. 이는 펑션을 너무 많이 사용했을때 발생할 수 있습니다.
추가된 버전: 3.3.1
Throwable
모든 발생 가능한 것들은 이 클래스를 상속합니다. 아니라면 스크립트에서 발생할 수 없습니다.
추가된 버전: 3.3.1
UnageableMobException
만약 나이 관련 펑션을 나이를 먹을 수 없는 엔디티에게 사용하면 발생합니다.
추가된 버전: 3.3.1
UntameableMobException
만약 길들이는 것에 관련된 펑션을 길들일 수 없는 엔디티에게 사용하면 발생합니다.
추가된 버전: 3.3.1