プログラミング制御構造まとめ

制御構造(条件分岐/フロー制御)まとめ.

言語別各論

📝例外処理(Exceptions)

プログラムがある処理を実行している途中で,なんらかの異常が発生した場合に, 現在の処理を中断 (中止) して, 別の処理を行うこと. その際に発生した異常のことを例外と呼ぶ.

ref: 例外処理 - Wikipedia

よくある 2 つの概念.

  • try: 例外ハンドラをもつ例外補足コンテクストを生成.
  • raise: もっとも内部の例外補足コンテキストへ jamp し, そこにある例外ハンドラを起動.

各コンテキストはスタックで管理され, try はスタックの 1 つに marker をつける. raise は marker にジャンプして marker の場所に例外処理のコンテキストを挿入する.(ref. CTMCP p93)

例外の種類

  • Asynchronous Exceptions: 非同期例外
  • Synchronous Exceptions: 同期例外
    • Traps: 意図的に OS が止める breakpont, systemcall, file open
    • Faults: リカバリ可能な例外, page fault, segmentation fault
    • Aborts: リカバリ不可能な例外, プログラムは強制終了.

💡例外がないと戻り値チェックでウンコード

例外をつかわないと, コンテクストごとの結果を検証必要があり, return 文 と case 文が乱立するうんこコードが出来る.

例えば, 下位のコンテキスト (A) で発生したエラーは, return -> return -> して上位でも戻り値のエラーチェックが必要.

#define ERROR -1
#define OK 0
 
int main (void) {
  if (C ()==ERROR) {
    printf ("Error\n");
  }
}
 
int A () {
  return ERROR;
}
 
int B () {
  if (A () == ERROR) {
    return ERROR;
  }
  else {
    return OK;
  }
}
 
int C () {
  if (B () == ERROR) {
    return ERROR;
  }
  else {
    return OK;
  }
}

🔖ウンコード

🔖検査例外

明示的に例外を処理する処理をかかないとコンパイルエラーする例外.

チェック例外, checked exceptionとも.

事前にコンパイルで検査例外をチェックすることは当初よいアイデアと思われていたが, コードが肥大化してメンテナンスの手間がかかり, 人類は次第にその害悪に気づいた.

Index

📝Result型

Result type.

📝関数型プログラミングでよく用いられるエラーハンドリング. Type-Safe Errorsとも.

  • 戻り値またはエラーコードを保持するモナディック型
  • これは、例外処理に頼らないエラー処理の洗練された方法を提供する
  • 失敗する可能性のある関数がResult型を返す場合、プログラマは結果にアクセスする前に、結果が成功であるか失敗であるかを確認することが強制される。これにより、プログラマがエラー処理を忘れる可能性が排除される。
  • 📝Rustはすべて例外処理はこれを採用したことで有名.

Result型 - Wikipedia


<2025-03-10 Mon 16:07> 記憶てはScalaの勉強をしたときにはじめて接した概念.

up: 🔖プログラミング