paint-brush
例外の真の重要性: PHP と Golang でのエラー処理@shcherbanich
8,399 測定値
8,399 測定値

例外の真の重要性: PHP と Golang でのエラー処理

Filipp Shcherbanich7m2023/10/20
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

振り返ってみると、私たちがエラーに対処した方法は、開発者のニーズと課題が時間の経過とともにどのように変化したかを示しています。
featured image - 例外の真の重要性: PHP と Golang でのエラー処理
Filipp Shcherbanich HackerNoon profile picture

最近、私と同じソフトウェア開発者の友人と興味深い会話をしました。私たちは、さまざまなプログラミング言語がエラーにどのように対処するかを議論していましたが、いくつかの意見の相違が生じました。私たちは、どのエラー処理方法が最も効果的か、長所と短所は何か、さらには例外なく対処できるかどうかについて考えました。この会話をきっかけに、さまざまなプログラミング言語でのエラー処理をさらに深く探求したいという私の好奇心が刺激され、学んだことを共有できることに興奮しています。


私は毎日の仕事で PHP と Golang を使用しています。この 2 つの言語は、エラー処理に異なるアプローチを採用しています。この記事では、これらの言語がエラーにどのように対処するかを比較する旅に連れて行きたいと思います。しかし、発見すべきことはまだたくさんあります。また、代替のエラー処理方法を検討し、さまざまなタスクにどの方法が最適であるかを判断します。それでは、コーディングの世界におけるエラー処理の魅力的な探索の準備をしてください。

エラー処理方法: PHP と Golang の詳細

プログラミングにおけるエラー処理は非常に重要です。振り返ってみると、私たちがエラーに対処した方法は、開発者のニーズと課題が時間の経過とともにどのように変化したかを示しています。


当初は、エラー コードが返されることが主流でした。これらの単純な、多くの場合は整数ベースで、示された成功または特定のエラー タイプを返します。これらは効率的でしたが、コードが乱雑になり、読みにくくなることが多いという欠点がありました。エラーを解読するには、ドキュメントやエラー コードの定義を常に参照する必要がありました。


例外は、より直観的な解決策として登場しました。コードを返す代わりに、プログラムはエラーが発生するたびに例外をスローし、開発者がコードの指定された部分でエラーをキャッチできるようにします。このアプローチは、その明確さとエラー処理を一元化できることから採用されました。


その後すぐに、特に非同期環境でエラー コールバックが普及しました。アイデアは単純でした。エラーを待つ代わりに、それを処理する関数 (コールバック) を渡してみてはどうでしょうか。 onError(callback)パターンは JavaScript で普及し、エラー処理がよりプロアクティブになりました。


一部のプログラミング言語では、エラーや例外を処理できるようにする特別な関数が導入されています。たとえば、LUA には、 error()pcall()があります。これらは、従来のエラー コードと例外メカニズムを組み合わせたものでした。


前に説明したエラーを処理する方法と並行して、モナドなどの概念が関数型プログラミング言語に登場しました。これらは成功または失敗を示すコンテキストで値をラップし、より表現力豊かで安全なエラー処理を可能にします。それ以外にも、他のさまざまな機能パターンとともに使用できるため、強力かつ簡潔なエラー処理と操作の連鎖が可能になります。


しかし、焦点を PHP と Golang に移しましょう。 PHP には広範なエラー処理機能があります。バージョン 5.0 より前は、このプログラミング言語には例外がまったくありませんでした。開発者は、ユーザーレベルのエラー/警告/通知メッセージを生成するtrigger_error関数など、さまざまなエラー処理方法を使用しました。 set_error_handler関数。スクリプト内でエラー処理のコールバックを定義でき、関数の実行が失敗した場合に積極的に「false」または「null」を返すことができます。


これらのメソッドの多くは、現在でも PHP コードで広く使用されています。それでも、例外と例外を処理するための言語構造の出現により、従来のエラー処理方法に比べて多くの利点が提供されるため、開発者の間で広く普及しました。たとえば、エラーと発生場所に関するより詳細な情報、構造化された方法でエラーを処理できるようになり、複雑なコードの可読性が向上しました。


一方、Golang は、関数が結果とエラーの両方を返す複数の戻りパターンを扱い、暗黙的な例外処理よりも明示的なエラー チェックを重視します。 Golang の作成者は、プログラミング言語は可能な限り明確かつシンプルであるべきだという原則を遵守しています。その設計の主な目標は、特に Google のような大規模な組織において、コードを記述するための明確で効率的な言語構造を提供することでした。このようにして、開発者は、コード スタイルについて議論したり、複雑でわかりにくいコードを理解しようとして時間を無駄にすることなく、問題の解決に集中できます。

PHP と Golang のエラー処理: 可読性の比較

PHP の例外アプローチ

前述したように、PHP には多くのエラー処理機能がありますが、最近では例外が最も一般的な方法です。このアプローチは直観的であり、他の多くのプログラミング言語を反映していますが、複数の潜在的なエラー原因に対処する場合、入れ子構造、つまり入れ子構造が生じる可能性があります。この「try-catch」ネストにより、特に初心者にとってコードが読みにくくなる可能性があります。分解してみましょう。

利点:

  • 簡潔さ。 PHP の例外処理によりコードが簡潔になり、必要な全体の行数が削減されます。これは、コードの 1 つのセグメントでさまざまな種類のエラーを処理する場合に特に有益です。これは、集中型のエラー処理メカニズムを提供します。
  • 普遍。 PHP の例外メカニズムは他の多くの言語と似ているため、多くの開発者にとって馴染みがあり、他のコーディング バックグラウンドから PHP への移行が容易になります。現在最も人気のあるプログラミング言語は、この方法でエラーを処理します。

短所:

  • 流れの中断。主な欠点は、コードの論理フローがわかりにくくなる可能性があることです。例外が伝播すると、元のエラー原因を追跡することが困難になる可能性があり、デバッグが複雑になります。
  • 過度の依存。例外に依存しすぎると、過剰使用につながる可能性があり、些細なエラーが例外としてスローされ、コードが不必要に複雑になります。

Golang の明示的なエラー処理

Golang は独特のアプローチを採用しています。関数は、例外の代わりに、通常の戻り値と一緒にエラー値を返します。このエラーを確認して処理するのは開発者の責任です。これにより Go コードが長くなる可能性がありますが、いつ、どこでエラーが発生する可能性があるかを明確に理解できるようになります。


利点:

  • 制御フローのシンプルさ。 Go はエラー処理に例外を使用しないため、「try-catch」ブロックは必要ありません。制御フローの複雑さが軽減されます。
  • 柔軟性。 Golang のアプローチにより、開発者は、各エラーを伝播するか、ログに記録するか、修正措置を講じるかなど、ケースバイケースで各エラーを処理する方法を決定できます。この制御により、より堅牢なアプリケーションを実現できます。

短所:

  • 長さ。最も一般的な批判の 1 つは、Go のエラー処理が冗長なコードにつながる可能性があるというものです。失敗する可能性のある関数は追加のエラー値を返す必要があり、これらのエラーを処理すると、エラー チェックのボイラープレートが繰り返し行われることがよくあります。
  • 監視の可能性。エラー処理は明示的であるため、開発者がエラーを忘れたり、意図的にエラーをチェックしないことを選択したりするリスクがある可能性があります。
  • コンテキストの欠如。 Go の標準エラー タイプはシンプルで一貫性がありますが、多くの場合、エラーが発生した場所と理由に関するコンテキスト情報が不足しています。コンテキストを追加するパッケージやパターンはありますが、一部の開発者が望むほど統合されていません。

パフォーマンスとリソース消費の違い

PHP と Golang の間の議論は、プログラミングのさまざまな領域に及ぶことがよくありますが、最も重要な論争領域の 1 つは、特にエラー処理に関して、パフォーマンスとリソース消費における違いです。


PHP の場合、例外によりスタック トレースの作成が可能になり、エラーにつながる一連の呼び出しを追跡するのに役立ちます。このトレースは、デバッグに貴重な情報を提供します。ただし、特に複雑なアプリケーションでこのようなトレースを生成するには、計算リソースとメモリが必要になります。したがって、例外が頻繁にスローされると、アプリケーションの速度が低下し、リソース フットプリントが増加する可能性があります。


一方、 Golang の方法では、例外スタック トレース作成のオーバーヘッドが回避されます。代わりに、関数はプログラマが明示的にチェックする必要があるエラー値を返します。このアプローチにより、パフォーマンスが向上し、リソース消費が削減されます。ただし、責任が開発者の肩に直接押し付けられることになり、ある意味でリソースを大量に消費することになります。


PHP の例外ベースのメソッドを使用するか、Golang の明示的なエラー処理を使用するかの決定は、単にパフォーマンスとリソースの問題だけではなく、トレードオフによって決まります。例外は豊富なデバッグ情報を提供しますが、それにはコストがかかります。 Golang のアプローチはリソースに優しいですが、エラー管理には細心の注意が必要です。

結論: 例外なく生きることは可能であり、また必要なのでしょうか?

Web 開発のニーズから生まれた PHP は、シンプルさと共有ホスティングを優先しました。エラー処理により、Web アプリケーションにとって開発者にとって使いやすいものになります。一方、ソフトウェア大手 Google によって作成された Golang は、最新のシステム プログラミング向けに設計されました。複数の戻り値を使用した明示的なエラー処理を強調します。このパラダイムは、より明確なコード フローを促進し、エラーを通常の値として作成し、より正確な制御を提供します。


さまざまな起源と目標が、エラー処理の哲学を形成しました。 PHP は、アクセシビリティと寛大さを重視し、Web 開発者の間で広く採用されることを目指しました。対照的に、Golang は、スケーラブルで保守可能なシステムに理想的なパフォーマンス、明瞭さ、堅牢性を追求しました。


彼らのアプローチは例外の必要性についての議論を必然的に引き起こす。


例外のないコーディングは困難に思えるかもしれませんが、開発者はより透過的で予測可能なコードを目指すことができます。ただし、これは普遍的に適しているわけではない可能性があり、特定の言語の意図と用途を理解する必要性を強調しています。


私に関して言えば、例外にはデメリットが生じる可能性があるにもかかわらず、可能であれば例外を仕事で使用したいと考える開発者の 1 人です。 Golang のアプローチは私にとってあまり快適ではありませんが、自分が何をしているのか、何を達成したいのかについてもっと考える必要があります。どちらの方法をより使いたいですか?コメントでこの情報を共有していただければ幸いです。