だんだんワケが分からなくなってきた

・プログラムで上手に処理しなければならないエラー (例:入力したファイル名がおかしい)
・値が入った瞬間にマシンがハングアップするような処理系が処理することすらできないエラー

前者は、エラー処理のアルゴリズムが担当
前者のエラーは、コードにバグがなくても、プログラム実行中に確実に起こりうるエラー

後者の値のチェックを、assertion が担当
理想的には、assertionの警告を良く読んでデバッグしていくと、後者のエラーは最後には無くなる
(だからassertionはデバッグのときだけ必要)