検索

PHP Master | Exceptional Exceptions

コアポイント

  • PHP例外は、予期しないイベントを示すために投げて捕まることができる特別なクラスです。回復不可能なエラーとは異なり、例外は、呼び出しコードによって処理されることを目的としており、実行チェーンがキャッチされるまでバブルを上方にします。
  • PHPエラーと例外の違いは、エラーが回復不能であり、メインの実行ループで発生することです。これは、コードまたは環境の安定性に問題があることを示しています。実行ループ、およびシステムが不安定であるという意味ではありません。
  • すべての非成功した状況では、例外をスローする必要があるわけではありません。例外は、実際に実行を継続できない場合にのみスローする必要があります。これは、通常の操作または標準ではないアクション、異常が、通常の状況および予想される状況から逸脱することを意味します。
  • 一般的なExceptionのトップは、「問題」があると言うことと同等であり、コードは何が起こっているのかわからない。代わりに、カスタム例外を常にスローして、現在の状況のコールコードに通知する必要があります。
  • グローバルキャプチャブロックは、最高レベルのキャプチャブロックであり、そのレベルに泡立つすべての例外をキャプチャする必要があります。これは、生産コードの唯一の一般的な例外ハンドラーである必要があります。他のハンドラーは、具体的であり、例外に限定されている必要があります。例外は、処理方法と責任を負う方法を知っています。

PHP 5は、予期しないイベントを示すために(スローされたエラーとは対照的に)スロ​​ーおよびキャッチできる特別なクラスである例外処理メカニズムを導入します。エラーとは異なり、例外は、呼び出しコードによって処理されることを目的としています。例外がスローされると、現在のスコープのコードが実行を停止します(throwステートメントが実行された後の行はありません)、コントロールは最初の一致する例外ハンドラー(キャプチャブロック、設定された例外ハンドラー、または言語によって提供される例外ハンドラー)。コードの実行は、例外がキャッチされた場合にのみ、そこから続きます。この記事は、エントリレベルでの例外を説明することではなく、例外をより適切に使用する方法に関するアドバイスを提供することを目的としています。以前に例外を使用したことがない場合は、PHPマニュアルに相談するか、私の友人が書いた本「PHP Master:Writing Condeded Code」を読む必要があるかもしれません。

エラーは例外ではありません

例外について学んだかもしれませんが、PHPエラーと(カスタム)例外の違いについて疑問に思うかもしれません。ロジックは実際には非常に単純です。エラーは回復不能であり、メインの実行ループで発生し、環境の安定性を示します。たとえば、スカラー値に配列としてアクセスしてE_NOTICEを上げようとすると、コードに問題があることを意味します。継続的な実行が安全であるという保証はありません。この状態は、実行中に修正することはできません。パーサーによって発見された予期しないT_IFによってE_PARSEがトリガーされると、これが物事の安定性にどのように影響するかを理解できます。一方、例外は回復可能であり、メインの実行ループの外で発生する可能性があり、システムの安定性を示していません。 「指定された入力でリクエストを完了することはできないため、その情報が自由にLengthExceptionを投げることができます。したがって、現在の値で指定された命令を完了することはできません。これは、環境が不安定であることを意味するものではなく、パディングまたは切り捨てによってコードが値の長さを調整する必要があることを意味します。コードはこの例外をキャッチし、値を更新し、再試行することができます。

すべての例外が例外これは、答えるのが最も難しい質問の1つです。例外をスローする必要があるのは正確ですか?もちろん、例外は前の段落の3つのルールに準拠する必要があります。破損したメモリに遭遇したときに例外を投げることは非常に悪い習慣です。環境が実行を継続するために安全でないことが判明するため、PHPができるだけ早く中止できるように、コードは代わりにエラーをスローする必要があります。ただし、エラーが不要であっても、すべての非成功した状況には例外は必要ありません。つまり、すべての失敗した状況が例外ではありません。 「異常」という言葉は、通常の操作でも標準でもないアクションと、通常の状況や予想される状況から逸脱する異常を指します。元同僚は、夕食時に、彼らの会社が使用しているXML/RPCサービスがすべての公共面でのバックボーンであると私に言った。その後、建築家は例外と、非成功しない状態を示す際の彼らの利便性について学びました。この柱は、他の機能に加えて、単一のサインオン機能を提供します。データベースに直接アクセスする代わりに、WebアプリケーションはXML/RPCサービスを照会します。これは、すべてのWebアプリケーションにサービスを提供する集中データストアに基づいて応答します。有効な資格情報が提供されると、成功したステータスが返されます。問題が発生すると、例外がスローされ、障害の理由を示すメッセージが表示されます。キャプチャしやすいと、印象的で光沢のあるエラーメッセージでメッセージをユーザーに表示できます。しかし、ユーザーは誤ったユーザー名および/またはパスワードを提供していることを本当に期待から逸脱していますか?私のプロジェクトでは、私が扱うユーザーは完璧ではありません。彼らは物事をタイプしたり忘れたりします。誤った資格情報を取得することは非常に一般的であり、有効な資格情報よりもさらに一般的です。検証資格情報は、システムへのログインの予想される動作であるため、この場合、XML/RPCサービスは、検証が成功しているかどうかを示すステータスを返す必要があります。資格情報は失敗しますが、検証プロセス自体は依然として正常に実行されます。検証プロセスが正しく実行されない場合、他の問題があります。たぶん、データストアはアクセスできない、または他の何かです。データストアなしでは実行できないため、ログインシステムがデータストアに接続できないことは非常にまれです。したがって、これには例外をスローする必要があります。注:一部の人々は、ログインシステムがデータストアに接続できないことが環境が不安定であり、したがってエラーが発生することの兆候であると主張する場合があります。ただし、システムにログインすることは、データストレージのエラーを発生させる責任はありません。逆に、データストレージコネクタ/ラッパーが必要と思われる場合、エラーを発生させる必要があります。一般的に言えば、例外を開発者が介入し、表示し、それらを処理しなければならない状況と考えることができます。例外シナリオで発生するコードは、それ自体でこれを行うことはできません。これはおそらく、開発者がコードを調べたことであり、彼らがそれを処理する方法は、それが起こったときにそれを起こさせることです。ネットワークオペレーションセンターにすべての例外をメールで送信しないでください。できることと処理すべきことを処理すると、例外は実際に実行を継続できない場合にのみスローされます。

「問題 "

数年前、私がヨーロッパをハイキングしていたとき、私はギリシャの駅で忘れられない光景につまずきました。ロッカーエリアの1つは爆弾のように見え、地面にドアが散らばり、半分はヒンジにぶら下がっているか、壊れていました。後で、彼らがロッカーエリアを削除していることを知りましたが、この領域が非アクティブ化されていることをクライアントにどのように伝えたかは注目に値します。中央の部分にはたくさんのテープがあり、「問題」という言葉で紙を貼り付けました。技術的には、これは完全に正しいです。明らかにロッカーに何か問題があり、状況は顧客に通信することで処理されました。あなたはそれを面白いと思うかもしれませんが、実際、あなたはあなたのコードに頻繁にこれを見るでしょう。 Exceptionを投げるだけで、基本的に「問題」と言っており、コードは何が起こっているのかわからない。 Exceptionはそれぞれの例外の基本クラスですが、独自のタイプで拡張できます。例外のより広いコレクションはSPLライブラリにありますが、これは限界からはほど遠いものです。 Zend FrameworkやSymfonyなどの主要なPHPフレームワークを見ると、ほぼすべての異なる状況にカスタム例外を使用することがわかります。これらすべてのファイルを作成して、動的にロードしてすべての異なるタイプを維持できるようにするのは少し面倒ですが、これにより、そのフレームワークとそのフレームワークの消費者に対して何が起こるかを細かく制御できます。あなたがExceptionだけを投げるなら、あなたは何かが間違っていることを確認することができ、あなたもあきらめるかもしれません。これは、キャプチャブロックをサイレントオペレーターとして使用し、誰かがこの状況を何らかの形で修正できることを期待していることをあきらめるだけで、それらがエラーである方法で例外を使用することを意味します。

グローバルキャプチャ

非カスタムの例外を使用して、考えられるすべての例外をキャッチすることが悪い考えである場合、なぜ言語はこれを許可するのですか?特定の例外、つまりグローバルなキャプチャルールを常に使用およびキャッチするルールには、1つの例外があります。グローバルキャプチャブロックは最高レベルのキャプチャブロックであり、そのレベルに泡立つすべての例外をキャッチする必要があります。 PHP自体には(「致命的なエラー:猛攻撃の例外...」というメッセージが表示されていますか?)が含まれていますが、カスタムハンドラーでオーバーライドしてフォールバックとして機能します。このハンドラーをset_exception_handler()関数で設定することができます。そのため、「catch (Exception $e) {」などの行を禁止するPHPMDルールセットにルールを追加できます。これが、生産コードにある必要がある一般的な例外ハンドラーの唯一の理由であり、まだキャッチされていないExceptionクラスのすべてのインスタンスをキャプチャします。他のハンドラーは、具体的であり、例外に限定されている必要があります。例外は、処理方法と責任を負う方法を知っています。ここで慎重に進むと、ハンドル可能な例外を一度泡立たせます(そしてコードで修正します)。

概要

要するに、例外は、特定の入力で要求された命令をコードに完了できない場合にのみスローされます。常に、現在ケースにある呼び出しコードを実際に指示するカスタム例外をスローし、他のコードを呼び出す場合は、処理できるものと処理できる例外のみをキャッチします。これにより、ブラックボックス(カスタム例外)のようにコンポーネントが少なくなり、コンポーネントを統合する開発者がコードを変更する必要がある可能性が低くなります(そうすべきではない例外をキャッチしないでください)。私たちは常に顧客/マネージャーが具体的であるように言いますが、私たちも具体的であるべきです!

(フォトリアからの写真)

PHP例外処理に関するよくある質問

  • PHP例外処理の目的は何ですか?
PHP例外処理は、開発者がプロ​​グラムの実行中に発生する可能性のあるエラーや例外をハイパーバイズできるようにする強力なメカニズムです。プログラムのある部分から別の部分に制御を転送する方法を提供します。 PHP例外処理は、指定されたエラーが発生したときにコード実行の通常のフローを変更するために使用されます。これにより、コードがメインプログラムロジックからエラー処理コードを分離するため、コードの読み取りと管理が容易になります。

  • PHPのトライキャッチブロックはどのように機能しますか?
PHPでは、トライキャッチブロックを使用して例外を処理します。 Tryブロックには例外をスローする可能性のあるコードが含まれていますが、CatchブロックにはTryブロックに例外がスローされた場合に実行されるコードが含まれます。 Tryブロックに例外がスローされた場合、スクリプトの実行を停止し、制御がスローされた例外タイプに一致する最初のキャッチブロックに渡されます。

  • PHP例外処理における最終的なブロックの役割は何ですか?
PHP例外処理の最終的なブロックは、例外がスローされているかどうかにかかわらず、コードの一部が常に実行されることを確認するために使用されます。これは、操作の成功や失敗に関係なく実行する必要があるファイルやデータベース接続の閉鎖などのアクティビティのクリーニングに役立ちます。

  • PHPでカスタム例外を作成する方法は?
PHPでは、組み込みの例外クラスを拡張することにより、カスタム例外を作成できます。これにより、例外にカスタム機能を追加するか、アプリケーションドメイン固有の例外を作成できます。カスタム例外を作成するには、例外を拡張する新しいクラスを定義し、必要なカスタムメソッドまたはプロパティを追加できます。

  • PHPの例外とエラーの違いは何ですか?
PHPでは、エラーはスクリプトの実行を防ぐ深刻な問題であり、例外は通常の実行プロセスを変更する条件です。エラーは通常、構文エラーまたは未定義の機能を呼び出すことによって引き起こされます。一方、例外は、プログラムにとって致命的ではないが特別な取り扱いが必要な条件を処理するためにしばしば使用されます。

  • PHPで複数の例外を処理する方法は?
PHPでは、複数のキャッチブロックを使用して複数の例外を処理できます。各キャッチブロックは、特定のタイプの例外を処理します。例外がスローされると、Catchブロックはコードに表示される順序でチェックされます。スローされた例外タイプを処理できる最初のキャッチブロックが実行されます。

  • PHPの例外を再投げることはできますか?

はい、PHPで例外を再スローすることができます。これは、どういうわけか例外を処理したいが、より高いレベルの例外ハンドラーをキャッチしたい場合に非常に便利です。例外を再スローするには、キャッチブロックのスローステートメントを使用してください。

  • PHPで例外を記録する方法は?

PHPでは、キャッチブロックでERROR_LOG関数を使用して例外を記録できます。これにより、メッセージやスタックトレースを含む例外に関する情報を指定されたログファイルにログに記録できます。

  • phpのpdoexceptionとは何ですか?

PDOExceptionは、PDO操作でエラーが発生したときにスローされる例外です。 PDO(PHPデータオブジェクト)は、PHPでデータベースにアクセスするための一貫したインターフェイスを提供するデータベース抽象化レイヤーです。 PDOExceptionは、SQLSTATEエラーコードやデータベースドライバーのエラーメッセージなどのエラーに関する情報を提供します。

  • PHPの猛攻撃の例外を処理する方法は?

PHPでは、カスタム例外ハンドラー関数を定義し、set_exception_handler関数を使用してデフォルトの例外ハンドラーとして設定することにより、猛攻撃の例外を処理できます。この関数は、トライキャッチブロックによってキャッチされていない例外がスローされるたびに呼び出されます。

以上がPHPマスター|例外的な例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。