PHP - 错误处理

你好,有抱负的PHP开发者们!今天,我们将深入探索PHP中的错误处理世界。如果你是编程新手,不用担心;我会逐步引导你理解每个概念,就像我过去几年里教过的无数学生一样。所以,拿起一杯咖啡(或者你最喜欢的饮料),让我们开始吧!

PHP - Error Handling

die() 函数

让我们从一个简单但强大的函数开始:die()。这个函数就像是代码中的紧急停止按钮。当PHP遇到die()时,它会立即停止执行并输出一条消息。

以下是一个基本示例:

<?php
$file = fopen("important_file.txt", "r");
if (!$file) {
die("哦不!无法打开文件。");
}
echo "如果你看到这条消息,文件已经成功打开!";
?>

在这段代码中,我们试图打开一个文件。如果失败了,die()会停止一切并显示我们的自定义消息。就像告诉PHP:“如果你做不到这一点,就停下来告诉我!”

错误处理函数

现在,让我们升级我们的错误处理技能,使用一个自定义的错误处理函数。这就像拥有一个处理错误的私人助手。

以下是如何创建一个:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>哦哦!出了点问题:</b><br>";
echo "错误:[$errno] $errstr<br>";
echo "错误位于第 $errline 行,文件 $errfile<br>";
}

set_error_handler("myErrorHandler");

// 让我们触发一个错误
echo($undefined_variable);
?>

在这个示例中,我们创建了一个名为myErrorHandler的函数,它提供了任何发生的错误的详细信息。然后我们使用set_error_handler()告诉PHP使用这个函数。当我们尝试输出一个未定义的变量时,我们的自定义错误处理程序就会启动,提供一个友好且信息丰富的消息。

ArithmeticError 类

PHP 7引入了几个新的错误类,包括ArithmeticError。当数学运算中出现错误时,会抛出这个类。

让我们看看它是如何工作的:

<?php
$number = 1;
try {
$result = $number << -1;
} catch (ArithmeticError $e) {
echo "哦哦!发生了数学错误:" . $e->getMessage();
}
?>

在这里,我们试图使用一个负数进行位运算,这是不允许的。PHP通过ArithmeticError捕获这个错误,并且我们优雅地处理它。

DivisionByZeroError

记得数学课上老师说过你不能除以零吗?PHP也记得!当你尝试除以零时,会抛出DivisionByZeroError

<?php
function divide($numerator, $denominator) {
if ($denominator == 0) {
throw new DivisionByZeroError("喂!你不能除以零!");
}
return $numerator / $denominator;
}

try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "错误:" . $e->getMessage();
}
?>

在这个示例中,我们创建了一个divide函数,它检查分母是否为零。如果是,它会抛出一个带有自定义消息的DivisionByZeroError

ArgumentCountError

你是否曾经给别人打电话,然后忘记了你想要说什么?ArgumentCountError就是PHP说“嘿,你忘了告诉我一些重要的事情!”的方式!

<?php
function greet($name) {
return "你好,$name!";
}

try {
echo greet();  // 哦哦,我们忘了提供一个名字!
} catch (ArgumentCountError $e) {
echo "错误:" . $e->getMessage();
}
?>

在这个例子中,我们没有给greet函数提供一个名字。PHP抛出一个ArgumentCountError,我们捕获并处理它。

TypeError

当值的类型不符合预期时,会抛出TypeError。就像点了一份披萨,却得到了一个汉堡!

<?php
function addNumbers(int $a, int $b) {
return $a + $b;
}

try {
echo addNumbers("5", "10");  // 我们传递的是字符串,而不是整数!
} catch (TypeError $e) {
echo "哦哦!" . $e->getMessage();
}
?>

在这里,我们的addNumbers函数期望整数,但我们传递了字符串。PHP捕获这种类型不匹配并抛出TypeError

PHP中的异常处理

PHP中的异常就像马戏团中的安全网。它们在错误变成大问题之前捕获它们。让我们看看如何使用它们:

<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("年龄不能是负数!");
}
if ($age < 18) {
throw new Exception("抱歉,你必须年满18岁。");
}
return "欢迎!你已经足够大了。";
}

try {
echo checkAge(15);
} catch (Exception $e) {
echo "错误:" . $e->getMessage();
} finally {
echo "<br>感谢使用我们的年龄检查器!";
}
?>

在这个示例中,我们在检查某人是否足够大以进入某个地方。我们使用try尝试代码,catch处理任何异常,finally无论是否抛出异常都要执行的代码。

创建自定义异常处理程序

最后,让我们创建我们自己的自定义异常处理程序。这就像设计你自己的错误消息系统!

<?php
class CustomException extends Exception {
public function errorMessage() {
$errorMsg = '错误在第 '.$this->getLine().' 行,文件 '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一个有效的电子邮件地址';
return $errorMsg;
}
}

$email = "[email protected]";

try {
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new CustomException($email);
}
} catch (CustomException $e) {
echo $e->errorMessage();
}
?>

在这里,我们创建了一个CustomException类,为无效的电子邮件地址提供了详细的错误消息。然后我们使用这个自定义异常来处理验证电子邮件地址时的错误。

到这里,我们已经涵盖了PHP中的广泛错误处理技术。记住,好的错误处理就像系安全带——在真正需要之前,它可能看起来不必要。继续练习这些概念,很快你就能像专业人士一样处理错误了!

方法 描述
die() 终止脚本执行并输出一条消息
set_error_handler() 设置一个用户定义的错误处理函数
try-catch 用于异常处理
throw 用于抛出一个异常
finally 指定无论是否抛出异常都要运行的代码
自定义错误类 允许创建特定的错误类型

Credits: Image by storyset