5.19 try/catch

5.19 try/catch

Haxe는 try/catch 구문을 사용해 값을 잡을 수 있어요:

try try-expr
catch (varName1:Type1) catch-expr-1
catch (varName2:Type2) catch-expr-2

런타임 중 try-expression의 평가가 throw를 일으키면, 이후의 어떤 catch 블록이 그것을 잡을 수 있어요. 이 블록들은 다음으로 구성됩니다:

  • 던져진 값을 담는 변수 이름,
  • 어떤 종류의 값을 잡을지 결정하는 명시적 타입 주석,
  • 그 경우 실행할 표현식.

Haxe는 어떤 종류의 값이든 던지고 잡을 수 있어요. 특정 exception이나 error 클래스에서 상속받는 타입으로 제한되지 않습니다. 하지만 Haxe 4.1.0 이후에는 haxe.Exception과 그 후손의 인스턴스만 던지고 잡는 것이 강력히 권장됩니다.

Catch 블록은 위에서 아래로 검사되며, 던져진 값과 타입이 호환되는 첫 번째 블록이 선택됩니다.

이 과정은 컴파일 타임 유니피케이션(unification) 동작과 많은 유사성이 있어요. 하지만 검사가 런타임에 이루어져야 하므로 몇 가지 제한이 있습니다:

try/catch의 타입: try 블록의 값과 모든 catch 블록의 값은 유니파이되어야 해요. 다이아몬드(catch 블록의 값이 try 블록과 타입에서 다르고 공통 타입이 없는) 상황에서는 결과 타입이 Dynamic이 될 수 있습니다.

try 블록과 catch 블록의 표현식이 모두 Void를 반환하면 전체 표현식도 Void예요.

출처: try/catch

본문

try/catch 기본

try try-expr catch (varName:Type) catch-expr ... 형태로, try 평가 중 throw된 값을 타입이 호환되는 첫 catch 블록이 잡아요. catch 블록은 변수명·타입 주석·실행 표현식으로 구성됩니다.

규칙

  • Haxe 4.1 이후 haxe.Exception만 던지고 잡는 것이 권장됩니다.
  • catch 블록은 위에서 아래로 검사되고 첫 호환 블록이 선택돼요.
  • 타입은 런타임에 존재해야 하며(클래스/열거/Dynamic/익명 구조체), 추상 타입 catch는 대상 타입으로 해석될 때만 동작합니다.

타입

try와 모든 catch 블록의 값 타입은 유니파이되어야 해요. 공통 타입이 없으면 Dynamic이 될 수 있고, 모두 Void면 전체도 Void입니다.

더 알아보기