例外
(そのため、例外に関する記述を「但し書き(ただしがき)」とも言う。)
《原則》と《例外》の話は、実体法のレベルだけで現れるわけではない。手続き法のレベルでも現れる。
法律をよく知らずに法律を読む人(たとえば特定の筋書きのある小説や、理念表明などのように読もうとする人など)は「結論はどちらだ? 結論がはっきりしない。」とか「法律は面倒だ。」などと感想を漏らすことがある。
では、なぜ(複雑になるのに)法律には一般に「原則」と「例外」があるのかと言うと、人間社会の事象というのは、ケースバイケースであり、一律にどちらかとは決められないからである。ケースバイケースであるから複雑になりはするが、そうしたやりかたで決めるからこそ、社会正義に則した妥当な結論を導ける、という面があるのである。
例外的な状態を意図的に狙うもの、いわゆる「法律の網をかいくぐる」ような者が現れることがある。それが度を超し常態化すると、法律があっても機能していない、意味が無い、という状態になってしまうこともある。
例外には「歯止め」を設定する場合もある。たとえば道路交通法は緊急自動車をその例外に認めている。その有益性は明らかであろう。しかしたとえば警察車両であれば無条件でこれを認めるのではなく、警告灯やサイレンをならすことを義務づけている。
プログラミングでは、プログラムがある処理を実行している途中で生じ得る、設計から逸脱した状態を「例外」という。プログラムの利用者が対処するエラーとは異なり、例外は開発者が対処する。例外発生時にはプログラムにより実現されるシステムの内部状態に矛盾が生じており、適切に対処されなければ以後の処理継続が不可能になるか、処理が継続できても破壊的な処理が進行してしまう可能性が高い。設計上無視する場合は問題にならないが、例外の見落としは重大なシステム障害に繋がる。システムが正常な内部状態を保つためには、開発者により全ての例外への対処が設計されていなければならない。
例えば次のような状態である。
0で除算しなければならない状況になる
存在しないファイルを読み書きしようとする
データベースに重複したキーのレコードを挿入しようとする
例外が発生した場合に、現在の処理を中断(中止)して別の処理や回避処理を行うことを例外処理という。
プログラミング言語としては、C++、C#、Visual Basic.NET、Java、Pythonなどが例外機構を備えている。Javaでは例外が生じた場合の処理のしかたをあらかじめ記述することで、処理が全体として破綻しないようにすることができる。(例外が起こりうる処理をtryブロックに記述し、続くcatchブロックに、想定する例外とそれらに対する処理を記述しておくことができる)
Windowsでのブルースクリーンが表示される「例外0E」なども例外にあたる。
また、CPUが0での除算などの実行できない処理に遭遇することについても言う。UNIX系 OS で「ハードウェア例外」が発生すると、カーネルはプロセスに対してSIGFPEやSIGSEGVなどのシグナルを生成する。