예외

예외(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(예외종류 @예외변수) {} 부분의 코드가 실행됩니다. 예외 종류에 맞는 예외의 경우에만 해당 코드가 실행되며, 코드 안에서는 주어진 예외변수에서 예외의 정보를 확인할 수 있습니다.

예외 정보의 키 값은 다음과 같습니다.

예외 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