logo

ジュリアで例外処理する方法 📂ジュリア

ジュリアで例外処理する方法

概要

地の果てまで一人で居る辛さを知ってる人は、ああ、分かるんだ

コーディング中にわからないエラーに苦労した人は、プログラミングにおいてエラーがとても大事だということを分かっている…

Juliaでは、error() 関数や @error マクロを使ってエラーを出すことができる。現在のJulia v1.63を基準に、25種類の組み込み例外が定義されている1

コード

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

例えば、プログラムで 対数関数 $\log$ を使う時、入力は実数だけ許されるべきだと考えられる。しかし、Juliaでは基本的に複素数に拡張された $\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をレイズするように限定した。

@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では、入力が実数でなければ、とりあえずエラーをスローするように限定した。

レイズとスローは、どちらもエラーを起こすという意味で、大きな文脈での違いはない。レイズはPythonなどで使われる表現で、スローはJavaなどで使われる表現だ。

全体のコード

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