ジュリアで例外処理する方法
概要
地の果てまで一人で居る辛さを知ってる人は、ああ、分かるんだ
コーディング中にわからないエラーに苦労した人は、プログラミングにおいてエラーがとても大事だということを分かっている…
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