私は現在、Haskellで例外を使用する正しい方法に頭を悩ませようとしています。例外がどのように機能するかは簡単です。私はそれらを解釈する正しい方法の明確な絵を得ようとしています。
基本的な立場は、適切に設計されたアプリケーションでは、例外がトップレベルに逃げてはならないということです。例外は明らかに、設計者が予期していなかったものです。つまり、異常な実行時の発生(ファイルが見つからないなど)ではなく、プログラムのバグ(ゼロ除算など)です。
stderr
そのために、すべての例外をキャッチし、「これはバグです」というメッセージを出力する単純なトップレベルの例外ハンドラーを作成しました(プログラムを終了するために例外を再スローする前に)。
ただし、ユーザーがCtrl+Cを押したとします。これにより、例外がスローされます。明らかに、これはプログラムのバグではありません。ただし、このようなユーザーの中止を予測して対応できない場合は、バグと見なされる可能性があります。したがって、プログラムはこれをキャッチして適切に処理し、終了する前に必要なクリーンアップを実行する必要があります。
ただし、これを処理するコードは、例外をキャッチし、リソースなどを解放してから、例外を再スローします。したがって、例外がトップレベルになったとしても、それが処理されなかったことを必ずしも意味するわけではありません。すぐに終了したかったということです。
だから、私の質問:この方法でフロー制御に例外を使用する必要がありますか?明示的にキャッチするすべての関数はUserInterrupt
、例外を再スローするのではなく、明示的なフロー制御構造を使用して手動で終了する必要がありますか?(しかし、発信者はどのようにして終了することを知っていますか?)UserInterrupt
トップレベルに到達しても大丈夫ですか?しかし、その場合、ThreadKilled
同じ議論で、それも大丈夫ですか?
要するに、割り込みハンドラーはUserInterrupt
(そしておそらくThreadKilled
)のために特別なケースを作るべきですか?HeapOverflow
またははどうですかStackOverflow
?それはバグですか?それとも「プログラムの制御が及ばない状況」なのか?