質問: なぜ例外処理メカニズムなしで現代の言語を設計するのですか? 多くの最新言語 豊富な例外処理を提供 機能ですが、appleのswiftプログラミング言語 例外処理メカニズムを提供していません 。私は例外的に染み込んでいますが、これが何を意味するのか気になりません。 swiftにはアサーションがあり、もちろん戻り値がありますが、例外ベースの考え方が例外のない世界にどのようにマップされるか(そして、その点については なぜそのような世界が望ましいのですか )。swift例外で実行できること)のような言語で私ができないことはありますか?例外を失うことで何かを得ますか?たとえば、どのように表現すればよいですか 次のようなもの try: operation_that_can_throw_ioerror() except ioerror: handle_the_exception_somehow() else: # we don't want to catch the ioerror if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do() 例外処理が不足している言語(swiftなど)で?
回答: ここにいくつかの素晴らしい答えがありますが、1つの重要な理由が十分に強調されていないと思います:例外が発生すると、オブジェクトが無効な状態のままになる可能性があります。例外を "キャッチ"できる場合、例外ハンドラコードはこれらの無効なオブジェクトにアクセスして操作できます。これらのオブジェクトのコードが完全に記述されていない限り、それはひどく間違って行われます。これは非常に非常に困難です。たとえば、vectorの実装を想像してみてください。誰かが一連のオブジェクトを使用してベクターをインスタンス化したが、初期化中に例外が発生した場合(おそらく、オブジェクトを新しく割り当てられたメモリにコピーしているときなど)、ベクターの実装を正しく実装しないようにして、メモリがリークしています。 stroustroupによるこの短い論文はベクターの例をカバーしています 。そして、それは氷山の一角にすぎません。たとえば、すべての要素ではなく一部の要素をコピーした場合はどうなりますか? vectorのようなコンテナーを正しく実装するには、取るすべてのアクションをリバーシブルにする必要があるため、操作全体が(データベーストランザクションのように)アトミックです。これは複雑であり、ほとんどのアプリケーションはそれを誤解しています。そして、それが正しく行われたとしても、コンテナを実装するプロセスは非常に複雑になります。だからいくつかの現代の言語はそれは価値がないと決定しました。たとえば、rustには例外がありますが、それらを「キャッチ」することはできないため、コードが無効な状態のオブジェクトと対話する方法はありません。