例外処理

例外処理について

  • 他のオブジェクト指向言語と同様、MK Scriptも構造化例外処理に対応しています。
  • 最初に例を示します。
    try
      # 例外が発生する可能性のあるコード
    
      # 例外の発生
      raise 1
    
      # 例外の発生
      raise MyClass.new()
    
    catch |<例外オブジェクト変数>| {例外補足条件}
      # 例外処理コード
    
    catch |<例外オブジェクト変数>| {例外補足条件}
      # 例外処理コード
    
    else
      # tryブロックで例外が発生しなかった際に呼び出されるコード
    
    finally
      # catchブロックで例外が補足された場合もしくは例外が発生しなかった場合に呼び出されるコード
    end
    

例外の発生

  • コードから例外を発生させるには、raise <式> を記載します。
  • 式で記載された値が例外オブジェクトとして設定され、後述のcatch例外ハンドラに評価、補足されます。
      raise 0
    
      raise MyClass.new()
    
      raise |a|{ Console << a << "\n" }
    

例外の捕捉

  • try ... catch ブロック内で発生した例外は catch ... ブロックで補足可能です。
  • catch ブロックは、tryブロックのあとに複数記述可能です。
  • catch ブロックは以下の構造を持ちます
catch |e|{補足判定式}
  例外処理コード

catch |e|{補足判定式}
  例外処理コード

catch ...

else
  tryブロックで例外が発生しなかった際に呼び出されるコード

finally
  catchブロックで例外が補足された場合もしくは例外が発生しなかった場合に呼び出されるコード

end
  • catch ブロックでは、|e|{補足判定式} パラメータ付きノードにより、例外オブジェクトの評価が行われます。
  • この評価式が真(true)を返した場合、後続の例外ブロックが |e| block 例外処理コード end の形でパラメータ付きノードとして評価されます。
    • {補足判定式} は省略可能です。省略された場合、全ての例外が
    • パラメータ "e" には、raise の右辺で与えられた式の値が格納されます。
  • あるcatchブロックで例外が補足された場合、catchブロックの評価完了後、finallyブロックが存在すればfinallyブロック内の処理を行い例外処理を完了します。finallyブロックが存在しない場合、catchブロックの評価完了時点で例外処理を完了します。
  • tryブロックに続く全てのcatchブロックで例外が補足されなかった場合、ブロックの実行は中断され例外処理は呼び出し元のブロックに移譲されます。
  • try ブロック内で例外が発生しなかった場合、catch ... ブロックに続くelse ブロックが実行されます。その後、finallyブロック内の処理を行い、例外処理を完了します。