>  기사  >  백엔드 개발  >  PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예

PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-07-16 09:11:541904검색

Yii는 기본적으로 CApplication에 예외 및 오류 인계를 구현했으며 이는 PHP의 set_Exception_handler 및 set_error_handler를 통해 구현됩니다. 이 두 가지 PHP 내장 함수를 통해 프로그램에서 발견되지 않은 예외 및 오류를 처리할 수 있어 프로그램의 유지 관리성이 향상됩니다.

PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예

기본적으로 Yii는 CApplication::handleException에 예외 처리를 할당하고 CApplication::handleError에 오류 처리를 할당하지만 항목 파일에서 두 상수 YII_ENABLE_EXCEPTION_HANDLER 및 YII_ENABLE_ERROR_HANDLER를 false로 정의하여 Yii 사용을 비활성화할 수 있습니다. 예외 및 오류 처리 메커니즘.

다음 내용에서는 예외사항과 오류를 통칭하여 오류라고 하며, 필요한 경우 세부적으로 구분합니다. YII_DEBUG 상수(기본값은 false이며 항목 파일에서 설정할 수 있음)는 오류 정보 표시에 매우 중요한 영향을 미칩니다. 디버그 모드에서는 오류 출력이 가장 상세합니다. 프로그램이 실행되면 YII_DEBUG를 false로 수정해야 합니다.

디버그 모드 여부에 관계없이 Yii 프로그램에서 오류가 발생하면 해당 오류 정보가 기록됩니다(오류 수준은 오류, 기본 범주는 응용 프로그램). 차이점은 디버그 모드에서는 자세한 정보가 웹페이지에 직접 표시된다는 점입니다.

CApplication:: handlerError($code,$message,$file,$line)

위 메소드는 관련 로직을 구현합니다. 이 두 함수가 호출되지 않으면 후속 오류 처리 과정에서 예외나 오류가 다시 발생하면 CApplication::handlerError가 다시 호출되어 무한 루프가 발생할 수 있습니다. 따라서 Yii는 일시적으로 CApplication::handleError를 사용하여 후속 오류 및 예외를 처리하는 것을 금지합니다(PHP의 기본 오류 처리 메커니즘 사용). 이를 통해 루프 호출이 발생하지 않도록 합니다.

PHP 오류 처리 오류가 발생하면 PHP는 어떤 정보를 로그에 기록합니까? 오류 코드(예: PHP의 E_ERROR E_WARNING E_STRICT E_DEPRECATED) 메시지 내용(예: 정의되지 않은 vaiable $input) 오류를 생성한 파일 경로 오류를 생성한 줄 번호 추가 추적 역추적 정보(debug_backtrace를 통해 달성됨) 현재 URL

해당 로깅 외에도 Yii는 오류에 대한 후속 처리(예: 실행 중단, 오류 페이지 표시 등)도 수행합니다. 기본적으로 오류 처리는 CErrorHandler 구성 요소에 전달됩니다. onError 이벤트 핸들러를 CApplicaton 2차 처리 인계에 바인딩하여 실현할 수 있으며 여기의 디자인은 매우 유연합니다.

이때 CErrorEvent가 생성되고($code, $message, $file 및 $line과 같은 여러 주요 매개변수 포함) 처리를 위해 CErrorHandler 구성 요소에 전달됩니다. 특히 CErrorHandler::handleError에 의해 처리됩니다. 이 프로세스는 주로 오류 관련 정보를 구성하고 적절한 방식으로 표시하는 것입니다.

디버그 모드인지(YII_DEBUG==true)는 오류 메시지 표시에 큰 영향을 미칩니다. 디버그 모드에서는 자세한 오류 추적 정보를 표시하고, 프로덕션 모드에서는 사용자에게 친숙한 페이지를 표시하려고 합니다. 따라서 여기의 오류 표시는 다르며, 차이점은 아래에 설명되어 있습니다.

디버그 모드에서는 예외 보기가 직접 렌더링되어 오류를 표시합니다. 다음 경로에 따라 검색됩니다:

protected/views/system/Exception.php

YII_PATH/views/Exception.php

분명히 views/system 디렉토리는 기본적으로 애플리케이션에 정의되어 있지 않으므로 시스템 프레임워크가 사용됩니다. 보기 파일과 함께 제공됩니다. 최종 포함 파일은 Yii 프레임워크의 views/Exception.php입니다.

위 분석을 통해 디버깅 모드에서 사용자 정의 예외 페이지를 사용하려면(일반적으로 별 의미가 없을 수 있음) protected/views/system/Exception.php 파일을 구성해야 한다는 것을 알 수 있습니다. 사용할 수 있습니다. 변수는 $data입니다.

비디버깅 모드에서는 다음과 같은 처리가 이루어집니다.

구성 파일의 errorHandler 구성 요소에 errorAction 라우팅 정보가 정의되어 있으면 직접 실행하고, 그렇지 않으면 2단계 프로세스를 실행합니다.

오류 보기를 로드해 보고, 다음 경로에 따라 검색하세요(첫 번째 검색된 파일이 사용됩니다)

protected/views/system/zh_cn/error500.php

protected/views/system/error500.php

보호된 /views/system/zh_cn/error.php

protected/views/system/error.php

YII_PATH/views/zh_cn/error500.php

YII_PATH/views/error500.php

YII_PATH/views/zh_cn/ error .php

Y II_PATH/views/error.php

예외 처리 이전 분석에 따르면 예외 처리 메커니즘은 오류 처리 메커니즘과 유사하며 로그도 기록됩니다. 예외.$EXCEPTIONCLASS". CHttpException 클래스 예외인 경우 범주 이름은 예외.CHttpException.$STATUS_CODE입니다. 예를 들어, 데이터의 예외 분류를 예외.CDbException이라고 합니다.

다음으로, 오류 이벤트 CExceptionEvent는 처리를 위해 errorHandler로 전달됩니다. 모든 오류 정보는 CExceptionEvent 객체에 의해 전달됩니다. 처리 방법은 다음과 같습니다.

디버그 모드인 경우 다음 순서로 뷰 파일을 검색하며, 처음 검색된 파일을 사용합니다

protected/views/system/Exception.php

YII_PATH/views/ 예외.php

비디버깅 모드이고 구성 파일의 errorHandler 구성 요소에 대해 errorAction 속성 경로가 정의되어 있으면 실행하고, 그렇지 않으면 3단계로 이동하세요.

다음 순서로 뷰 파일을 로드해 보면 첫 번째로 검색된 파일이 사용됩니다

protected/views/system/zh_cn/error500.phpprotected/views/system/error500.phpprotected/views/system/zh_cn/error.phpprotected/views/system/error.phpYII_PATH/views/zh_cn/error500.phpYII_PATH/views/error500.phpYII_PATH/views/zh_cn/error.phpY II_PATH/views/error.php

플로우 차트 설명을 사용하면 더 명확해집니다. 뷰 파일을 검색하는 과정은 우리가 어떻게 작업하는지와 관련이 있기 때문에 더 중요합니다. 오류 페이지 세부 정보를 사용자 정의하려면 후속 순서도에서 프로세스를 자세히 설명합니다.

PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예

그림에서 볼 수 있듯이 가장 쉬운 방법은 errorHandler 구성 요소에 errorAction 속성을 설정하여 오류가 발생하는 경로를 지정하는 것입니다.

PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예

일반적으로 우리가 가장 우려하는 것은 프로덕션 모드에서 오류 페이지 표시, 위 분석 후 사용 가능한 두 가지 방법이 있습니다:

구성 파일에서 errorHandler 구성 요소에 대한 errorAction 라우팅 속성을 정의합니다(유연한 구성을 달성하려면 이 방법을 먼저 사용해야 함)

정의 사용자 정의 오류 페이지를 구현하려면 다음 파일 중 하나를 사용하세요. php

protected/views/system/error.php

첫 번째 방법은 유연하고 제어 가능한 뷰 파일을 컨트롤러에서 지정할 수 있습니다.

오류 핸들러 사용 예

yiiwebErrorHandler는 errorHandler라는 애플리케이션 컴포넌트로 등록되며, 애플리케이션 구성에서 다음과 같이 구성할 수 있습니다.

return [
'components' => [
'errorHandler' => [
'maxSourceLines' => 20,
],
],
];

위 코드를 사용하면 예외 페이지에 최대 20개의 소스 코드가 표시됩니다.

앞서 언급했듯이 오류 처리기는 치명적이지 않은 모든 PHP 오류를 포착 가능한 예외로 변환합니다. 즉, 다음 코드를 사용하여 PHP 오류를 처리할 수 있습니다.

use Yii;
use yii\base\ErrorException;
try {
10/0;
} catch (ErrorException $e) {
Yii::warning("pision by zero.");
}
// execution continues...

사용자에게 요청이 있음을 알리는 오류 페이지를 표시하려는 경우 유효하지 않거나 처리할 수 없는 경우 yiiwebNotFoundHttpException과 같은 yiiwebHttpException을 발생시키면 됩니다. 오류 처리기는 응답 HTTP 상태 코드를 올바르게 설정하고 적절한 오류 보기 페이지를 사용하여 오류 메시지를 표시합니다.

use yii\web\NotFoundHttpException;
throw new NotFoundHttpException();

맞춤형 오류 표시

yiiwebErrorHandler 오류 핸들러는 YII_DEBUG 상수 값에 따라 오류 표시를 조정합니다(디버그 모드에서 의미). 오류 핸들러는 예외와 자세한 함수 호출 스택 및 소스 코드 줄을 표시합니다. 디버깅 도움말, YII_DEBUG가 false인 경우 애플리케이션의 민감한 정보 유출을 방지하기 위해 오류 메시지만 표시됩니다.

추가됨: 예외가 yiibaseUserException을 상속하는 경우 YII_DEBUG 값에 관계없이 함수 호출 스택 정보가 표시되지 않습니다. 이는 이 오류가 사용자 생성 오류로 간주되어 개발자가 수정할 필요가 없기 때문입니다. .

yiiwebErrorHandler 오류 핸들러는 기본적으로 두 가지 보기를 사용하여 오류를 표시합니다.

@yii/views/errorHandler/error.php: 함수 호출 스택 정보를 포함하지 않는 오류 메시지를 표시하는 데 사용됩니다. YII_DEBUG가 false이면 모든 오류가 표시됩니다. 사용된.

@yii/views/errorHandler/Exception.php: 함수 호출 스택 정보가 포함된 오류 메시지를 표시할 때 사용됩니다.

오류 처리기의 yiiwebErrorHandler::errorView 및 yiiwebErrorHandler::ExceptionView 속성을 구성하여 사용자 정의 오류 표시 보기를 사용할 수 있습니다.

오류 작업 사용

지정된 오류 작업을 사용하여 오류 표시를 사용자 정의하는 것이 더 편리합니다. 이렇게 하려면 먼저 errorHandler 구성 요소의 yiiwebErrorHandler::errorAction 속성을 다음과 유사하게 구성합니다.

return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];

yiiwebErrorHandler:: errorAction 속성은 액션으로의 라우팅을 사용합니다. 위 구성은 함수 호출 스택 정보를 표시할 필요가 없는 오류는 사이트/오류 작업을 실행하여 표시된다는 의미입니다.

다음과 같이 사이트/오류 작업을 생성할 수 있습니다.

namespace app\controllers;
use Yii;
use yii\web\Controller;
class SiteController extends Controller
{
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
}

위 코드는 오류를 표시하기 위해 error라는 뷰를 렌더링하는 yiiwebErrorAction 클래스를 사용하여 오류 작업을 정의합니다.

yiiwebErrorAction을 사용하는 것 외에도 다음과 유사한 작업 방법을 사용하여 오류 작업을 정의할 수 있습니다.

public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null) {
return $this->render('error', ['exception' => $exception]);
}
}

이제 이 보기 파일에서 오류가 발생하면 views/site/error.php로 보기 파일을 생성해야 합니다. 작업은 yiiwebErrorAction으로 정의되며 액세스할 수 있습니다. 이 작업에는 다음 변수가 정의됩니다.

name: 오류 이름

message: 오류 메시지

Exception: HTTP 상태 코드, 오류 코드, 오류 호출 스택 등

보충 사항: 기본 애플리케이션 템플릿 또는 고급 애플리케이션 템플릿을 사용하는 경우 오류 작업 및 오류 보기가 이미 정의되어 있습니다.

사용자 정의 오류 형식

오류 처리기는 응답에서 설정한 형식에 따라 오류를 표시합니다. yiiwebResponse::format 응답 형식이 html인 경우 오류 또는 예외 보기를 사용하여 오류 정보를 표시합니다. 이전 섹션. 다른 응답 형식의 경우 오류 처리기는 오류 정보를 yiiwebResponse::data 속성에 배열로 할당한 후 해당 형식으로 변환합니다. 예를 들어 응답 형식이 json인 경우 다음과 같은 응답 정보를 볼 수 있습니다.

HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}

애플리케이션에서 사용할 수 있습니다. 구성에서 응답 구성요소의 beforeSend 이벤트에 응답하여 오류 응답 형식을 사용자 정의합니다.

return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];

上述代码会重新格式化错误响应,类似如下:

HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}

推荐学习:php视频教程

위 내용은 PHP가 Yii 프레임워크에서 오류와 예외를 처리하는 방법을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제