줄리아에서 예외처리하는 법

줄리아에서 예외처리하는 법

How to Handle Exception in julia

개요

지독한 외로움에 쩔쩔매본 사람은 알게되지 음 알게되지

코딩을 하다가 알수없는 에러에 고생해본 사람은 알게된다, 프로그래밍에 있어서 에러가 정말 중요하다는 사실을…

줄리아에서는 error() 함수 혹은 @error 매크로를 통해 에러를 낼 수 있다. 내장 예외는 줄리아 v1.63을 기준으로 25가지가 정의되어 있다. 1

코드

julia> log(1 + 2im)
0.8047189562170501 + 1.1071487177940904im

가령 프로그램에서 로그 함수 $\log$ 를 사용할 때, 입력으로 오직 실수만 허용되어야하는 경우를 생각해볼 수 있다. 그러나 줄리아에서는 위와 같이 기본적으로 복소수로 확장된 $\log_{\mathbb{C}}$ 를 제공한다. 프로그램은 에러 없이 돌아간다고 능사가 아니다. 의도하지 않은 계산은 예상치 못한 문제를 일으키기 때문에, 우리가 원하지 않는 계산이 일어난다면 애초부터 에러를 내고 돌아가질 않아야한다.

원래의 log정의역을 실수 $\mathbb{R}$ 으로 제한시키는 코드를 만들어보자.

error() 함수

julia> function Rlog(x)
           if typeof(1 + 2im) <: Real
               return log(x)
           else
               error(DomainError, ": Rlog allow real number only")
           end
       end

       Rlog(1 + 2im)
ERROR: LoadError: DomainError: Rlog allow real number only
Stacktrace:
 [1] error(::Type, ::String)
   @ Base .\error.jl:42
 [2] Rlog(x::Complex{Int64})
   @ Main c:\admin\REPL.jl:7
 [3] top-level scope
   @ c:\admin\REPL.jl:11
in expression starting at c:\admin\REPL.jl:11

위의 Rlog에서는 입력값이 실수가 아니면 DomainError를 레이즈Raise하도록 제한했다.

error() 매크로

julia> function Rlog2(x)
           if typeof(1 + 2im) <: Real
               return log(x)
           else
               @error "Rlog2 also allow Real number only"
           end
       end

       Rlog2(1 + 2im)
┌ Error: Rlog2 also allow Real number only
└ @ Main c:\admin\REPL.jl:17

위의 Rlog2에서는 입력값이 실수가 아니면 일단 에러를 쓰로Throw하도록 제한했다.

레이즈Raise와 쓰로Throw는 똑같이 에러를 발생시킨다는 의미고 큰 맥락에서 차이가 없다. 레이즈는 파이썬 등에서 쓰이는 표현이고 쓰로는 자바 등에서 쓰이는 표현이다.

전체 코드

log(1 + 2im)

function Rlog(x)
    if typeof(1 + 2im) <: Real
        return log(x)
    else
        error(DomainError, ": Rlog allow real number only")
    end
end

Rlog(1 + 2im)

function Rlog2(x)
    if typeof(1 + 2im) <: Real
        return log(x)
    else
        @error "Rlog2 also allow Real number only"
    end
end

Rlog2(1 + 2im)

환경

  • OS: Windows
  • julia: v1.6.3

  1. https://docs.julialang.org/en/v1/manual/control-flow/#Built-in-Exceptions ↩︎

댓글