プログラミング制埡構造たずめ

制埡構造(条件分岐/フロヌ制埡)たずめ.

蚀語別各論

📝䟋倖凊理(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: 🔖プログラミング