>  기사  >  백엔드 개발  >  PHP의 오류 처리 및 예외 처리 메커니즘에 대한 자세한 설명

PHP의 오류 처리 및 예외 처리 메커니즘에 대한 자세한 설명

不言
不言원래의
2018-04-10 15:43:143598검색

이 기사의 내용은 PHP의 오류 처리 및 예외 처리 메커니즘에 대한 자세한 설명입니다. 특정 참조 값이 있습니다. 필요한 친구는 이를 참조할 수 있습니다.

재인쇄: http://www.cnblogs.com/ 52php/ p/5665495.html

PHP 프로그램을 작성할 때 오류 처리는 중요한 부분입니다. 프로그램에 오류 감지 코드가 없으면 전문가가 아닌 것처럼 보이고 보안 위험이 발생할 수 있습니다.

<?php
    $a = fopen(&#39;test.txt&#39;,&#39;r&#39;);
    //这里并没有对文件进行判断就打开了,如果文件不存在就会报错
?>


那么正确的写法应该如下:


1

2

3

4

5

6

7


<?php
    if (file_exists(&#39;test.txt&#39;)) {
        $f = fopen(&#39;test.txt&#39;, &#39;r&#39;);
        // 使用完后关闭
        fclose($f);
    }
?>


1. PHP 오류 처리의 세 가지 방법

A. 간단한 die() 문은

2

3

4


5

6

7

if (!file_exists(&#39;aa.txt&#39;)) {
    die(&#39;文件不存在&#39;);
} else {
    // 执行操作
}
// 如果上面die()被触发,那么这里echo接不被执行
echo &#39;ok&#39;;


简洁写法:


1

2


file_exits(&#39;aaa.txt&#39;) or die(&#39;文件不存在&#39;);
echo &#39;ok&#39;;


B. 사용자 정의 오류 및 오류 트리거

1. 오류 처리기(일반적으로 구문 오류 처리에 사용되는 사용자 정의 오류)

최소 두 개의 매개변수를 처리하는 기능이 있어야 하는 사용자 정의 오류 함수(처리기)를 만듭니다. (error_level 및 errormessage), 그러나 최대 5개의 매개변수(error_file, error_line, error_context)를 허용할 수 있습니다.

구문: ​​

function error_function($error_level, $error_message, $error_file, $error_line, $error_context)

// 생성 후 , set_error_handler() 함수를 다시 작성해야 합니다.

set_error_handler('error_function', E_WARNING); // 여기서 error_function은 위에서 만든 사용자 정의 프로세서 이름에 해당하며 두 번째 매개변수는 사용자 정의 오류 핸들러를 사용하는 것입니다.

오류 보고 수준(알아두세요)

이러한 오류 보고 수준은 오류 처리기가 처리하도록 설계된 다양한 유형의 오류입니다.

Value Constant Description
2 E_WARNING 치명적이지 않은 런타임 오류입니다. 스크립트 실행을 일시 중지하지 마십시오.
8 E_NOTICE 런타임 알림. 스크립트 검색 오류가 발생할 수 있지만 스크립트가 정상적으로 실행되는 동안에도 발생할 수 있습니다.
256 E_USER_ERROR 치명적인 사용자 생성 오류입니다. 이는 프로그래머가 PHP 함수 Trigger_error()를 사용하여 설정한 E_ERROR와 유사합니다.
512 E_USER_WARNING 치명적이지 않은 사용자 생성 경고. 이는 프로그래머가 PHP 함수 Trigger_error()를 사용하여 설정한 E_WARNING과 유사합니다.
1024 E_USER_NOTICE 사용자 생성 알림. 이는 프로그래머가 PHP 함수 Trigger_error()를 사용하여 설정한 E_NOTICE와 유사합니다.
4096 E_RECOVERABLE_ERROR 캐치 가능한 치명적인 오류입니다. E_ERROR와 비슷하지만 사용자 정의 핸들러로 포착할 수 있습니다. (set_error_handler() 참조)
8191 E_ALL E_STRICT 레벨을 제외한 모든 오류 및 경고. (PHP 6.0에서 E_STRICT는 E_ALL의 일부입니다.)

2、错误触发器(一般用于处理逻辑上的错误)

需求:比如要接收一个年龄,如果数字大于120,就认为是一个错误

传统方法:


1

2

3

4

5

6


<?php
if ($age > 120) {
    echo &#39;年龄错误&#39;;
    exit();
}
?>


트리거 사용:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


<?php
if ($age > 120) {
    // trigger_error(&#39;错误信息&#39;[,&#39;错误等级&#39;]); 这里错误等级为可选项,用于定义该错误的级别
    // 用户定义的级别包含以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
    trigger_error(&#39;年龄错误&#39;); // 这里是调用的系统默认的错误处理方式,我们也可以用自定义处理器
}
 
/**
 * 自定义处理器,与上面相同
 */
function myerror($error_level, $error_message) {
    echo &#39;error text&#39;;
}
 
//  同时需要改变系统默认的处理函数
set_error_handler(&#39;myerror&#39;, E_USER_WARNING); // 同上面,第一个参数为自定义函数的名称,第二个为错误级别【这里的错误级别通常为以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】
// 现在再使用trigger_error就可以使用自定义的错误处理函数了
?>

연습 질문:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


<?php
date_default_timezone_set(&#39;PRC&#39;);
function myerror($error_level, $error_message) {
    $info = "错误号:$error_level";
    $info .= "错误信息:$error_message";
    $info .= &#39;发生时间:&#39; . date(&#39;Y-m-d H:i:s&#39;);
    $filename = &#39;aa.txt&#39;;
    if (!$fp = fopen($filename, &#39;a&#39;)) {
        echo &#39;创建文件&#39; . $filename . &#39;失败&#39;;
    }
    if (is_writeable($filename)) {
        if (!fwrite($fp, $info)) {
            echo &#39;写入文件失败&#39;;
        } else {
            echo &#39;已成功记录错误信息&#39;;
        }
        fclose($fp);
    } else {
        echo &#39;文件&#39; . $filename . &#39;不可写&#39;;
    }
    exit();
}
 
set_error_handler(&#39;myerror&#39;, E_WARNING);
$fp = fopen(&#39;aaa.txt&#39;, &#39;r&#39;);
?>


C. 오류 로그

기본적으로 PHP는 php.ini의 error_log 구성에 따라 오류 기록을 서버의 오류 기록 시스템이나 파일로 보냅니다. error_log() 함수를 사용하여 오류 레코드를 파일이나 원격 대상으로 보낼 수 있습니다.

구문: ​​

error_log(error[, type, Destination, headers])

유형 부분은 일반적으로 3이며, 이는 오류 정보 추가를 의미합니다. 파일 뒤에는 원본 콘텐츠를 덮어쓰지 않고 대상, 즉 저장된 파일 또는 원격 대상을 나타냅니다. 예: error_log("$error_info",3,"errors.txt");

2. [핵심사항]

1. 기본문법


1

2

3

4

5

6

7

8

9

10


<?php
try {
    // 可能出现错误或异常的代码
    //catch 捕获  Exception是PHP已定义好的异常类
} catch (Exception $e) {
    // 对异常处理,方法:
    //1、自己处理
    //2、不处理,可以再次抛出 throw new Exception(&#39;xxx&#39;);
}
?>


2. 핸들러에는 다음이 포함되어야 합니다.

  1. try - 예외를 사용하는 함수는 "try" 코드 블록 내에 있어야 합니다. 예외가 트리거되지 않으면 코드는 평소대로 계속 실행됩니다. 그러나 예외가 트리거되면 예외가 발생합니다.

  2. throw - 예외를 트리거하는 방법을 지정합니다. 각 "throw"는 최소한 하나의 "catch"에 해당해야 합니다.

  3. catch - "catch" 코드 블록은 예외를 포착하고 예외 정보가 포함된 객체를 생성합니다.


12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22


<?php
/**
 * 创建可抛出一个异常的函数
 */
function checkNum($number) {
    if ($number > 1) {
        throw new Exception("Value must be 1 or below");
    }
 
    return true;
}
 
// 在 "try" 代码块中触发异常
try {
    checkNum(2);
    // 如果异常被抛出,那么下面一行代码将不会被输出
    echo &#39;If you see this, the number is 1 or below&#39;;
} catch (Exception $e) {
    // 捕获异常
    echo &#39;Message: &#39; . $e->getMessage();
}
?>


上面代码将获得类似这样一个错误:


1


Message: Value must be 1 or below


예제 설명:

위 코드는 예외를 발생시키고 이를 포착합니다.

  1. 숫자가 1보다 큰지 확인하고 그렇다면 예외를 발생시키는 checkNum() 함수를 만듭니다.

  2. "try" 코드 블록에서 checkNum() 함수를 호출하세요.

  3. checkNum() 함수에서 예외가 발생합니다.

  4. "catch" 코드 블록은 예외를 수신하고 예외 정보가 포함된 객체($e)를 생성합니다.

  5. 이 예외 객체에서 $e->getMessage()를 호출하여 이 예외로 인한 오류 메시지를 출력합니다.

그러나 "각 투구는 캐치와 일치해야 한다"는 원칙을 따르기 위해 최상위 예외 핸들러를 설정하여 누락된 오류를 처리할 수 있습니다.

set_Exception_handler() 함수는 포착되지 않은 모든 예외를 처리하는 사용자 정의 함수를 설정할 수 있습니다.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


<?php
/**
 * 设置一个顶级异常处理器
 */
function myexception($e) {
    echo &#39;this is top exception&#39;;
}
 
// 修改默认的异常处理器
set_exception_handler("myexception");
try {
    $i = 5;
    if ($i < 10) {
        throw new Exception(&#39;$i must greater than 10&#39;);
    }
} catch (Exception $e) {
    // 处理异常
    echo $e->getMessage() . &#39;<br/>&#39;;
 
    // 不处理异常,继续抛出
    throw new Exception(&#39;errorinfo&#39;); // 也可以用throw $e 保留原错误信息;
}
?>


사용자 정의 예외 클래스 만들기


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


<?php
class customException extends Exception {
    public function errorMessage() {
        $errorMsg = &#39;Error on line &#39; . $this->getLine() . &#39; in &#39; . $this->getFile() . &#39;: <b>&#39; . $this->getMessage() . &#39;</b> is not a valid E-Mail address&#39;;
        return $errorMsg;
    }
}
 
// 使用
try {
    throw new customException(&#39;error message&#39;);
} catch (customException $e) {
    echo $e->errorMessage();
}
?>


여러 캐치를 사용하여 다양한 상황에서 오류 메시지를 반환할 수 있습니다


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


<?php
try {
    $i = 5;
    if ($i > 0) {
        throw new customException(&#39;error message&#39;); // 使用自定义异常类处理
    }
    if ($i < -10) {
        throw new Exception(&#39;error2&#39;); // 使用系统默认异常处理
    }
} catch (customException $e) {
    echo $e->getMessage();
} catch (Exception $e1) {
    echo $e1->getMessage();
}
?>


异常的规则

  • 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。

  • 每个try或throw代码块必须至少拥有一个对应的 catch 代码块。

  • 使用多个 catch 代码块可以捕获不同种类的异常。

  • 可以在try代码内的catch 代码块中再次抛出(re-thrown)异常。

简而言之:如果抛出了异常,就必须捕获它。

相关推荐:

PHP中错误处理的一些方法

PHP异常处理和错误处理方法分享

PHP异常处理器的自定义

위 내용은 PHP의 오류 처리 및 예외 처리 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.