Juliaでは予期しない状態が発生したときに例外がスローされます。この例外を捉えて、エラー処理を行うことができます。
Juliaでは予期しない状態が発生した場合に例外がスローされる。スローされた例外を補足してエラー処理を行うには、try
/catch
を使う。
try
とcatch
に挟まれたスクリプト内で例外がスローされた場合に、catchブロックの処理が実行される。例外がスローされなければ、catchブロックは実行されない。
try
f = open("example.txt")
lines = readlines(f)
for line in lines
println(line)
end
close(f)
catch
println("ファイルをオープンできません")
end
エラーが発生した場合とエラーが発生しなかった場合の両方で実行する処理は、finally
ブロックに記述する。
try
f = open("notexist.txt")
lines = readlines(f)
for line in lines
println(line)
end
close(f)
catch
println("ファイルをオープンできません")
finally
println("処理が終了しました。")
end
あらかじめJuliaに組み込まれている例外には、次のようなものがある。
例外 | 説明 |
---|---|
ArgumentError | 関数呼び出しのパラメータが有効なシグネチャと一致しない。 |
BoundsError | 配列の索引外にアクセスしようとした。 |
DivideError | 0で除算しようとした。 |
DomainError | 関数またはコンストラクタの引数に有効な範囲外の値が渡された。 |
EOFError | ファイルやストリームから読み取るデータがなくなった。 |
ErrorException | 一般的なエラー |
InterruptException | ターミナル割込み(Ctrl + C)によってプロセスが停止された。 |
ParseError | parse関数に渡された式は、有効なJulia式として解釈できなかった。 |
SystemError | システムコールが失敗した。 |
TypeError | 型アサーションの失敗または不正な引数型の組み込み関数の呼び出し。 |
UndefRefError | アイテムまたはフィールドは、指定されたオブジェクトに対して定義されていない。 |
UndefVarError | 現在のスコープ内でシンボルが定義されていない。 |
StringIndexError | 有効でないインデックスの文字列にアクセスしようとしたときにエラーが発生した。 |
UndefVarErrorは、現在のスコープ内で定義されていないシンボルを参照したときにスローされる。
UndefVarError(var::Symbol)
try
println(undefined_var)
catch e
if isa(e, UndefVarError)
println("現在のスコープ内で", e.var, "は定義されていません。")
end
end
例外を明示的にスローするには、throw
文を使う。
たとえば、マイナスでない数値に対してのみ定義された関数は、引数がマイナスの場合にDomainErrorをするように記述できる。
function f(x)
if x >= 0
exp(-x)
else
throw(DomainError(x, "引数は負でなければならない"))
end
end