Julia言語の例外処理

Juliaでは予期しない状態が発生したときに例外がスローされます。この例外を捉えて、エラー処理を行うことができます。

try/catchとException

Juliaでは予期しない状態が発生した場合に例外がスローされる。スローされた例外を補足してエラー処理を行うには、try/catchを使う。

trycatchに挟まれたスクリプト内で例外がスローされた場合に、catchブロックの処理が実行される。例外がスローされなければ、catchブロックは実行されない。

try
  f = open("example.txt")
  lines = readlines(f)
  for line in lines
    println(line)
  end
  close(f)
catch
  println("ファイルをオープンできません")
end

例外が発生してもしなくても必ず実行する処理はfinallyブロックに記述する

エラーが発生した場合とエラーが発生しなかった場合の両方で実行する処理は、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は、現在のスコープ内で定義されていないシンボルを参照したときにスローされる。

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