尽管您已经熟悉 PHP 错误处理,但停止脚本并不总是最佳解决方案。PHP 5 引入了管理错误的新方法,称为 PHP try catch 和 throw 方法和异常。
PHP 异常是系统可以捕获和处理的指定错误。这意味着即使检测到错误,您也可以继续执行代码。PHP 异常处理的原则与 PHP 错误处理的原理不同,因为它是面向对象的(基于创建同时包含数据和函数的对象)。
通过异常及其操作,您可以修改脚本的正常流程,以防发生特定错误。PHP try catch 函数将创建一种方法来防止代码在遇到问题时停止。
内容
PHP 尝试捕获: 主要提示
在 PHP 版本 5 中引入了例外,当时标准错误处理被证明在某些情况下是不够的。
用于处理异常的主要函数是 PHP try catch 和 throw。
操作异常的方法
通常,当触发异常时,系统会执行以下步骤:
保存脚本的当前状态。
将执行切换到预定义的函数以进行异常处理。
后续步骤取决于具体情况。处理程序可以从之前保存的脚本状态继续执行,完全终止代码流或继续从不同的代码行执行。
在本教程中,我们将演示以下使用 PHP 异常来处理错误的方法。
注意:异常专门用于 PHP 错误处理,而不是用于跳转到脚本中的另一个点。
基本用法
抛出异常后,PHP 将停止正常的脚本流并查找它遇到的第一个块,它将执行该块。如果没有这样的代码块,将发生致命错误,并显示 .catch()Uncaught Error
尝试在没有语句的情况下PHP抛出异常:catch()
例复制
<?php//creating a function, which throws an exceptionfunction check_num($number) { if($number>1) { throw new Exception("The value has to be 1 or lower");
} return true;
}//triggering the exceptioncheck_num(3);?>
您将看到显示的警告消息:Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
尝试、投掷和接住
如果我们不希望我们的 Web 应用程序在每次捕获异常时崩溃,我们必须编写一个脚本来处理异常。用于处理异常的正确执行脚本应包括:
try块用于可能发生异常的代码部分。如果未触发异常,代码将正常运行。如果是这样,它就会被抛出。throw块用于触发异常。每个都必须至少有一个块。throwcatchcatch- 此块检索异常并生成保存其数据的对象。
在下面的示例中,您可以查看异常的触发(我们拥有所有必要的代码块):
例复制
<?php
//creating a function containing a potential exception
function checkNumber($number) { if($number > 1) { throw new Exception('The value has to be 1 or lower');
} return true;
} //triggering the exception inside a try()
try {
checkNumber(2); //In case the exception gets thrown, this is the message that is shown.
echo 'The value is 1 or lower';
} catch(Exception $e) { //catching the exception
echo 'Message: ' .$e->getMessage();
}?>
这是我们现在得到的错误:Message: Value must be 1 or below
有关代码示例的更多详细信息
在上面的例子中,我们抛出了一个异常,并用一个块来处理它。让我们一步一步地分解这个过程:catch()
调用的函数已定义。它的工作是检查值是否大于 1。如果满足这个条件,我们PHP会抛出异常。
check_num()我们刚刚创建的函数在块中被调用。
try()在函数内部,会引发异常。
catch()接收引发的异常并创建一个名为的对象,该对象保存有关异常的信息。$e我们通过从对象调用来回显异常中的错误消息,其中包含有关异常的数据。
$e->getMessage()
虽然规则规定每个异常都必须有一个 ,但有一种方法可以绕过它。为此,我们必须学习如何定义顶层异常处理程序类。catch()
自定义异常类
若要创建自定义异常处理程序,必须创建一个类,其中包含用于在触发 PHP 中处理异常的函数。此类必须是异常类的扩展。它将具有异常类的所有原始属性,但您可以为其提供自定义函数。
您可以在下面的示例中看到如何创建自定义异常类:
例复制
<?php
class customException extends Exception { public function error_message() { //defining the error message
$error_msg = 'Error caught on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is no valid E-Mail address'; return $error_msg;
}
}
$email = "someonesomeone@example...com"; try { //checking if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throwing an exception in case email is not valid
throw new customException($email);
}
} catch (customException $e) { //displaying a custom message
echo $e->error_message();
}?>
这个新类是原始异常类的几乎相同的副本。但是,现在它具有自定义功能。由于它具有原始类的所有方法和属性,因此我们可以使用普通异常类中包含的每个函数,例如 、、 。error_message()GetLine()GetFile()GetMessage()
代码解释
上面的代码示例抛出一个异常,该异常是使用自定义异常类捕获的:
该类是原始类的扩展,继承原始类的每个属性和方法。
custom_exception()函数已创建。通过使用这个函数,我们使代码在电子邮件地址无效的情况下返回错误消息。
error_message()$email是一个字符串,它不是有效的电子邮件地址。执行一个块并引发异常。
try()该块将显示一条错误消息。
catch()
多个异常的使用
通过使用多个异常,您可以一次检查多个条件。为此,应使用多个代码块、一个开关或多个异常。请记住,这些异常中的每一个都可能使用自己的类并显示其错误消息:if..else
例复制
<?php
class customException extends Exception { public function error_message() { //error message
$error_msg = 'Error caught on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is no valid E-Mail address'; return $error_msg;
}
}
$email = "someonesomeone@example.com"; try { //check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throwing an exception in case email is not valid
throw new customException($email);
} //checking for "example" in mail address
if(strpos($email, "example") !== FALSE) { throw new Exception("$email contains'example'");
}
} catch (customException $e) { echo $e->error_message();
} catch(Exception $e) { echo $e->getMessage();
}?>
有关示例的更多信息
在上面的例子中,我们看到测试了两个特定的条件。如果它们都不满足,则会引发异常:
该类是原始类的扩展,继承原始类的每个属性和方法。
custom_exception()函数已创建。如果电子邮件地址无效,此函数将返回错误消息。
error_message()$email是一个字符串,它是一个有效的电子邮件地址,包含单词 。example块执行,但不引发异常。
try()在检查第二个条件时,会引发异常,因为变量包含字符串值。
$emailexample该块将显示一条错误消息。
catch()
如果引发的异常属于没有特定捕获的 custom_exception 类,则基本异常捕获将处理异常。
重新引发异常
有时,在引发异常时,您可能希望以不同于标准的方式处理它。您可以在块中再次抛出异常。catch()
此类脚本旨在对 Web 应用程序的用户隐藏系统错误。编码人员可能希望了解系统错误,但用户不会(也不应该)关心这一点。如果要使错误消息用户友好,则可以重新抛出异常以更改消息:
例复制
<?php
class customException extends Exception { public function error_message() { //error message
$error_msg = $this->getMessage().' is no valid E-Mail address.'; return $error_msg;
}
}
$email = "someonesomeone@example.com"; try { try { //checking for "example" in mail address
if(strpos($email, "example") !== FALSE) { //throwing an exception if email is not valid
throw new Exception($email);
}
} catch(Exception $e) { //re-throwing exception
throw new customException($email);
}
} catch (customException $e) { //display custom message
echo $e->error_message();
}?>
示例详细信息
上面的代码示例测试输入的电子邮件地址是否将字符串作为其值。如果找到该字符串,则会重新引发异常:example
该类是原始类的扩展,继承原始类的每个属性和方法。
custom_exception()函数已创建。如果电子邮件地址无效,此函数将返回错误消息
error_message()$email是一个字符串,它是一个有效的电子邮件地址,包含单词 。example包含另一个块,用于重新抛出我们的异常。
try()try()由于变量包含字符串值,因此引发异常。
$emailexample捕获异常,然后抛出 a。
custom_exception此异常显示用户友好的错误消息。
如果异常没有在其当前块中遇到块,它可能会在更高级别中搜索 a。catch()try()catch()
顶级异常处理程序
调用的函数创建一个用户定义的函数,旨在处理每个未捕获的异常。让我们看一下这个例子:set_exception_handler()
例复制
<?php
function myException($exception) { echo "<b>Exception is </b> " . $exception->getMessage();
}
set_exception_handler('myException'); throw new Exception('Uncaught Exception has been caught');?>
这是我们应该从上面的代码中获得的输出:Exception: Uncaught Exception occurred
注意:在上面的代码中,没有 catch() 块。所有这些异常都由我们设置的顶级异常处理程序处理。
PHP 尝试捕获:摘要
以前的 PHP 版本(PHP 5 之前)有错误,但没有例外。
异常使用 和函数进行处理。
try()catch()throw()可以同时使用多个异常和多个块。
catch()您可以在块中编写大部分脚本来处理可能发生的所有异常。
try()可以在位于块内的块中引发异常。
catch()try()
陕公网安备 61012502000223号
评论一下吧