c语言编程笔录

首页 >   > 笔记大全

笔记大全

讨论php的错误和异常处理机制

更新时间:2023-10-26

错误处理机制

PHP中的错误分为三类:普通错误、警告和致命错误。可以通过错误报告级别来控制脚本对这些错误的处理方式。error_reporting() 函数返回当前错误报告级别,set_error_handler() 函数设置用于处理至少一个错误的用户定义的错误处理函数。

<?php
// 错误级别设置为E_ALL, 打印所有错误信息
error_reporting(E_ALL);

// 错误处理函数
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr";
}

// 设置错误处理函数
set_error_handler("customError");

// 触发错误
$test=2;
if ($test>1) {
      trigger_error("变量值必须小于等于 1",E_USER_NOTICE); // 触发自定义警告
}
?>

异常处理机制

PHP中也有异常处理机制,异常是一种可以被throw语句抛出的运行时错误,它表示程序运行过程中的一个意外情况,抛出异常的代码需要用try…catch语句块来捕获并处理异常。PHP中的Throwable接口继承自Exception,是所有异常和错误的基类。

<?php
// 创建自定义异常类
class customException extends Exception {
  public function errorMessage() {
    // 错误信息
    $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> 不是一个合法的E-Mail地址';
    return $errorMsg;
  }
}

// 触发异常
$email = "someone@example.com";
try {
  // 检测邮箱格式
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    // 如果不是一个合法的邮箱地址,抛出异常
    throw new customException($email);
  }
}
catch (customException $e) {
  // 输出错误信息
  echo $e->errorMessage();
}
?>

处理未捕获的异常

如果异常没有被try...catch 块捕获,则会引发一个致命错误,中断程序的执行,并生成以下类型的错误:

  • E_ERROR - 致命的运行时错误
  • E_CORE_ERROR - PHP启动时初始化过程中发生的致命错误
  • E_COMPILE_ERROR - 编译时致命错误

要用set_exception_handler()函数设置一个用户定义的异常处理程序来捕获未捕获的异常。

<?php
// 创建自定义处理异常的方法
function myException($exception) {
  echo "<b>异常信息:</b> " . $exception->getMessage();
}

// 自定义异常处理器
set_exception_handler('myException');

// 触发一个异常
throw new Exception('未捕获异常测试');
?>

自定义错误和异常处理类

在开发应用程序时,通常会为不同的错误和异常场景编写自定义的错误和异常处理程序。下面是一个自定义错误处理类和一个自定义异常处理类的示例:

<?php
// 自定义错误处理类
class customError {
  public function isError($errno, $errstr, $errfile, $errline) {
    error_log("ERROR: $errno - $errstr, line $errline in file $errfile");
    header("HTTP/1.1 500 Internal Server Error");
    echo "对不起,应用程序遇到了一个错误,稍后请再尝试。";
}
}

// 设置错误处理函数
$ce = new customError();
set_error_handler(array($ce, 'isError'));

// 自定义异常处理类
class customException extends Exception {
  public function errorMessage() {
    // 错误信息
    $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> 不是一个合法的E-Mail地址';
    error_log($errorMsg);
    header("HTTP/1.1 500 Internal Server Error");
    echo "对不起,应用程序遇到了一个错误,稍后请再尝试。";
  }
}

// 触发异常
$email = "someone@example.com";
try {
  // 检测邮箱格式
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    // 如果不是一个合法的邮箱地址,抛出异常
    throw new customException($email);
  }
}
catch (customException $e) {
  // 输出错误信息
  echo $e->errorMessage();
}
?>