Yii Framework 公式ガイド シリーズ 46 - 特別トピック: エラー処理
Yii は、PHP5 例外処理に基づいた完全なエラー処理メカニズムを提供します。アプリケーションの実行が開始され、ユーザーのリクエストが処理されると、PHP の警告と通知情報を処理するために handleError メソッドが登録されます。また、キャッチされなかった PHP 例外を処理するために handleException メソッドも登録されます。したがって、アプリケーションの実行中に PHP の警告/通知、またはキャッチされなかった PHP 例外が発生した場合、エラー ハンドラーが制御を引き継ぎ、必要な処理メカニズムを実行します。
ヒント: エラー ハンドラーは、PHP 関数 set_Exception_handler および set_error_handler を使用して、アプリケーションのコンストラクター メソッドに登録されます。 Yii にエラーや例外を処理させたくない場合は、エントリーファイルで
YII_ENABLE_ERROR_HANDLER
とYII_ENABLE_EXCEPTION_HANDLER
を false として定義できます。YII_ENABLE_ERROR_HANDLER
和YII_ENABLE_EXCEPTION_HANDLER
为false.
默认情况下,在触发onError事件(或onException事件)的时候,errorHandler(或exceptionHandler)将被触发。如果错误或者异常未被任何事件所处理,那么就需要运行errorHandler组件来处理了。
1. 引发异常
在Yii中引发异常和在普通PHP文件中没什么两样。你可以使用下面的代码来抛出异常:
throw new ExceptionClass('错误信息');
Yii定义了两个异常类:CException和CHttpException。前者是一个通用的异常类,而后者用于对最终用户显示异常信息。同时,后者有一个statusCode属性来代表HTTP状态码。异常的类型决定了显示效果,下面会细说。
提示: 想要告诉用户某个操作是错误的,那么引发一个CHttpException异常是最简单的方法了。比如说,如果用户在URL中提供了一个无效的ID值,我们可以显示一个404错误:
// 如果提交的ID是无效的 throw new CHttpException(404,'此页面不存在');
2. 显示错误
当一个错误被转发给组件CErrorHandler的时候,它会选择合适的视图来显示错误。如果这个错误要显示给最终用户的(比如说一个CHttpException)那么会使用名为errorXXX
的视图来显示错误。这个XXX
代表着HTTP错误码(比如说400,404,500等)。如果这是个内部错误,应该只能被开发者看到,那么将使用的视图名是exception
。在后一种中,将会显示完整的调用栈信息和错误行信息。
信息: 当应用运行在生产模式时,所有的错误,包括内部错误都会使用视图
errorXXX
。这是因为调用的栈信息和错误行信息可能包含一些敏感信息。这种情况下,开发者应该依靠错误日志来确定错误原因。
CErrorHandler会搜索合适的视图来显示错误信息,搜索的顺序如下:
WebRoot/themes/ThemeName/views/system
: 在当前主题视图下的system
目录中。WebRoot/protected/views/system
: 在应用的默认视图的system
目录中。yii/framework/views
: 在Yii提供的标准视图目录中。
因此,如果你想要自定义错误显示,可以直接在system
视图目录中或者主题的system
视图目录中创建一个视图文件。每个视图文件都是一个包含许多HTML代码的普通PHP文件。参考框架的view
目录下的文件,可以获得更多信息。
3. 使用一个动作来处理错误
Yii也可以使用控制器 动作来处理错误显示。实现的方法是在应用的配置文件中配置一个错误处理器。
return array( ...... 'components'=>array( 'errorHandler'=>array( 'errorAction'=>'site/error', ), ), );
上面的代码中,我们配置了CErrorHandler::errorAction属性,属性值是一个路由site/error
。这个路由指向SiteController
中的error
。当然,你也可以使用其他的路由。
我们可以这样来编写error
动作:
public function actionError() { if($error=Yii::app()->errorHandler->error) $this->render('error', $error); }
在这个动作中,首先从CErrorHandler::error中取得详细的错误信息。如果取得的信息非空,就使用CErrorHandler::error返回的信息来渲染error
视图。CErrorHandler::error返回的信息是一个数组,结构如下:
code
: HTTP 状态码(比如 403, 500);type
: 错误类型(比如 CHttpException,PHP Error
);message
: 错误信息;file
: 发生错误的PHP文件名;line
: 错误所在的行;trace
: 错误的调用栈信息;-
デフォルトでは、トリガー onError イベント (または onException イベント) が発生すると、errorHandler (または例外ハンドラー) がトリガーされます。エラーまたは例外がどのイベントでも処理されない場合は、errorHandler コンポーネントを実行してそれを処理する必要があります。 🎜source
1. 例外のスロー
🎜 Yii での例外のスローは、通常の PHP ファイルと何ら変わりません。次のコードを使用して例外をスローできます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜Yii は 2 つの例外クラス、CException と CHttpException を定義します。前者は一般的な例外クラスであり、後者はエンド ユーザーに例外情報を表示するために使用されます。同時に、後者には、HTTP ステータス コードを表す statusCode 属性があります。例外のタイプによって表示効果が決まります。これについては後で詳しく説明します。 🎜🎜🎜🎜 ヒント: 🎜 特定の操作が間違っていることをユーザーに伝えたい場合は、CHttpException をスローするのが最も簡単な方法です。たとえば、ユーザーが URL に無効な ID 値を指定した場合、404 エラーを表示できます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜2. Show error
🎜When aエラーはコンポーネント CErrorHandler に転送され、エラーを表示する適切なビューが選択されます。エラー (CHttpException など) がエンド ユーザーに表示される場合は、errorXXX
という名前のビューを使用してエラーが表示されます。このXXX
は HTTP エラー コード (400、404、500 など) を表します。これが開発者のみに表示される内部エラーである場合、使用されるビュー名はException
です。後者の場合、完全なコールスタック情報とエラー行情報が表示されます。 🎜🎜🎜🎜情報: 🎜 アプリケーションが運用モードで実行されている場合、内部エラーを含むすべてのエラーはビューerrorXXX
を使用します。これは、コール スタック情報とエラー行情報には機密情報が含まれている可能性があるためです。この場合、開発者はエラー ログを利用してエラーの原因を特定する必要があります。 🎜🎜CErrorHandler はエラー メッセージを表示するための適切なビューを検索します。検索順序は次のとおりです: 🎜- 🎜
WebRoot/themes/ThemeName/ views/ system
: 現在のテーマビューの下のsystem
ディレクトリ内。 🎜 - 🎜
WebRoot/protected/views/system
: アプリケーションのデフォルト ビューのsystem
ディレクトリ内。 🎜 - 🎜
yii/framework/views
: Yii が提供する標準ビューディレクトリ内。 🎜
system
ビュー ディレクトリまたはテーマのsystem
ビュー ディレクトリに直接作成できます。ビューファイル。各ビュー ファイルは、多くの HTML コードを含む通常の PHP ファイルです。詳細については、フレームワークのview
ディレクトリ内のファイルを参照してください。 🎜3. アクションを使用してエラーを処理する
🎜Yii は、コントローラー アクションを使用してエラー表示を処理することもできます。これは、アプリケーションの構成ファイルでエラー ハンドラーを構成することによって実現されます。 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜 上記のコードでは、CErrorHandler::errorAction 属性を構成し、属性値はルートsite/error
です。このルートは、SiteController
のerror
を指します。もちろん他のルートを利用することも可能です。 🎜🎜error
アクションは次のように記述できます: 🎜🎜🎜🎜🎜🎜rrreee🎜🎜🎜 このアクションでは、まず CErrorHandler::error から詳細なエラー情報を取得します。取得した情報が空でない場合は、CErrorHandler::error によって返された情報を使用してerror
ビューをレンダリングします。 CErrorHandler::error によって返される情報は、次の構造を持つ配列です: 🎜- 🎜
code
: HTTP ステータス コード (403、 500); 🎜 - 🎜
type
: エラーの種類 (CHttpException、PHP Error
など); >message code>: エラーメッセージ; 🎜 - 🎜
file
: エラーが発生した PHP ファイル名 🎜 - 🎜
line: error エラーが発生した行 🎜
- 🎜
trace
: エラー コール スタック情報 🎜 - 🎜
source code>: エラーが発生したコードコンテキスト。 🎜
ヒント: CErrorHandler::error が空かどうかを確認する理由は、
error
アクションにユーザーがアクセスでき、現時点ではエラーがない可能性があるためです。$error
配列をビューに渡すと、その配列は独立変数として自動的に解放されます。したがって、ビューでは$code
と$type
を使用してこの情報にアクセスできます。error
动作可以被用户访问到,这时候也许并没有什么错误。当我们传递$error
数组给视图,它将会被自动释放为独立的变量。所以,在视图中我们可以使用$code
,$type
来访问这些信息。4. 消息记录
一个
error
级别的错误信息会在错误发生时候被记录。如果这个错误是由PHP warning 或 notice引发的,那么这个消息将会被记录在php
这个分类中;如果错误信息是由未捕获的异常所引起的,那么分类将是exception.ExceptionClassName
4. メッセージの記録
エラーが発生した場合、
上記は、Yii Framework 公式ガイド シリーズ 46 - 特別トピック: エラー処理です。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) を参照してください。 !error
レベルのエラー メッセージが記録されます。エラーが PHP の警告または通知によって引き起こされた場合、メッセージはphp
カテゴリに記録されます。エラー メッセージがキャッチされなかった例外によって引き起こされた場合、カテゴリは Exception.ExceptionClassName になります。 (CHttpException の場合、その statusCode もクラス名に追加されます)。開発者はこれらのレコードを使用して、アプリケーション実行中のエラー メッセージを監視できます
🎜🎜 - 🎜

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











ミドルウェアを使用して Go 関数のエラー処理を改善する: 関数呼び出しをインターセプトして特定のロジックを実行できるミドルウェアの概念を紹介します。カスタム関数でエラー処理ロジックをラップするエラー処理ミドルウェアを作成します。ミドルウェアを使用してハンドラー関数をラップし、関数が呼び出される前にエラー処理ロジックが実行されるようにします。エラーの種類に基づいて適切なエラー コードを返します。 едоточитьсянаобработкеозибо

C++ では、例外処理は try-catch ブロックを通じてエラーを適切に処理します。一般的な例外の種類には、実行時エラー、論理エラー、範囲外エラーが含まれます。ファイルを開くエラー処理を例に挙げます。プログラムがファイルを開くのに失敗すると、例外がスローされ、エラー メッセージが出力され、catch ブロックを通じてエラー コードが返されます。これにより、プログラムを終了せずにエラーが処理されます。例外処理には、エラー処理の集中化、エラーの伝播、コードの堅牢性などの利点があります。

PHP の最適なエラー処理ツールとライブラリには次のものがあります。 組み込みメソッド: set_error_handler() および error_get_last() サードパーティ ツールキット: Whoops (デバッグとエラーのフォーマット) サードパーティのサービス: Sentry (エラーの報告と監視) サードパーティライブラリ: PHP-error-handler (カスタム エラー ログおよびスタック トレース) および Monolog (エラー ログ ハンドラー)

C++ クラス設計におけるエラー処理とログ記録には、次のものが含まれます。 例外処理: カスタム例外クラスを使用して例外をキャッチして処理し、特定のエラー情報を提供します。エラー コード: 整数または列挙を使用してエラー状態を表し、戻り値で返します。アサーション: 事前条件と事後条件を確認し、条件が満たされない場合は例外をスローします。 C++ ライブラリのロギング: std::cerr および std::clog を使用した基本的なロギング。外部ログ ライブラリ: レベル フィルタリングやログ ファイル ローテーションなどの高度な機能を提供するサードパーティ ライブラリを統合します。カスタム ログ クラス: 独自のログ クラスを作成し、基礎となるメカニズムを抽象化し、さまざまなレベルの情報を記録するための共通インターフェイスを提供します。

Go 関数では、非同期エラー処理はエラー チャネルを使用して、ゴルーチンからエラーを非同期に渡します。具体的な手順は次のとおりです。 エラー チャネルを作成します。 goroutine を開始して操作を実行し、非同期でエラーを送信します。チャネルからエラーを受信するには、select ステートメントを使用します。エラー メッセージの印刷やログ記録など、エラーを非同期的に処理します。このアプローチでは、エラー処理が呼び出しスレッドをブロックせず、実行をキャンセルできるため、同時コードのパフォーマンスとスケーラビリティが向上します。

Go 関数の単体テストでは、エラー処理に 2 つの主な戦略があります。1. エラーをエラー タイプの特定の値として表現し、期待値をアサートするために使用します。2. チャネルを使用してエラーをテスト関数に渡します。これは、同時実行コードのテストに適しています。実際のケースでは、関数が負の入力に対して 0 を返すようにするために、エラー値戦略が使用されます。

Golang では、エラー ラッパーを使用して、元のエラーにコンテキスト情報を追加することで新しいエラーを作成できます。これを使用すると、さまざまなライブラリまたはコンポーネントによってスローされるエラーの種類を統一し、デバッグとエラー処理を簡素化できます。手順は次のとおりです。errors.Wrap 関数を使用して、元のエラーを新しいエラーにラップします。新しいエラーには、元のエラーのコンテキスト情報が含まれています。 fmt.Printf を使用してラップされたエラーを出力し、より多くのコンテキストとアクション性を提供します。異なる種類のエラーを処理する場合は、errors.Wrap 関数を使用してエラーの種類を統一します。

Go でのエラー処理のベスト プラクティスには、エラー タイプの使用、常にエラーを返す、エラーのチェック、複数値の戻り値の使用、センチネル エラーの使用、およびエラー ラッパーの使用が含まれます。実用的な例: HTTP リクエスト ハンドラーで、ReadDataFromDatabase がエラーを返した場合は、500 エラー応答を返します。
