很多站长朋友们都不太清楚php异常分级别,今天小编就来给大家整理php异常分级别,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 PHP 怎么跳过错误继续执行 2、 关于php异常的问题,到底有什么好处 3、 PHP中处理异常有几种方式?请详述 PHP 怎么跳过错误继续执行@错误控制操作符可以实现这样的功能。
@符号可以忽略错误,有抑制错误的功能。
例如:
function db_connect()//连接数据库
{
@$db =mysql_connect('localhost','root','test');
if(!$db) {
throw new Exception('连接数据库失败!请重试!');
}
mysql_select_db('book');
return $db;
}
如果连接数据库不成功的,前面的“@”就能把错误显示给抑制住,也就是不会显示错误,然后再抛出异常,显示自己定义的异常处理,建议最好少用,这样会增加一定的系统开销。
关于php异常的问题,到底有什么好处在java、python等语言中,异常对于我们来说已经是必不可少的错误处理方式。异常处理是面向对象编程中的一种很强大的特性,然而很多PHPer对它不了解,甚至认为它会破坏代码结构。即使在很多开源项目中,也难以见到异常的踪影。那么,PHP中的异常,到底有没有意义呢?
PHP有两种错误处理机制,一种是内置错误,一种是异常。
内置错误,包含error、warning、notice等错误类型。很多PHP的内置函数,和一些PHP扩展,都会使用这种类型的错误。此类错误的优势是处理起来比较方便。不重要的错误,可以通过配置php选项来忽略它。我们甚至可以通过set_error_handler()函数,来集中处理非致命的错误。但是,PHP的宽容往往会让程序员养成一个坏习惯,那就是在代码中留下大量warning、notice级别的错误。这样对程序的调试和后期维护带来很多不便。而且致命的错误(Fatal Error),是没有办法处理的。这也是PHP的一大硬伤。
在PHP中使用异常有以下优势:
一、异常能提高程序的健壮性。
在需要处理错误的场景,异常能让我们轻松掌控程序,采取相应的处理措施。并不是所有的异常都需要处理。在一些异常发生时,没有其他替代方案,这时我们可以记录一些错误日志,并让程序崩溃。在web应用里,我们可以给用户显示一个500错误页面来增强用户体验。一些PHP的开源库会提供大量的异常类型,这样会帮助我们快速找出代码错误,减少程序BUG。
二、异常处理能增强程序的可维护性。
函数应该有一系列的输入,并且有唯一的输出。在参数不正确、或者发生系统错误时,我们需要告知使用者发生了什么样的错误,便于使用者处理和记录。
利用返回值、引用变量来返回错误在PHP程序中很常见:
function?foo($var)?{
????if?(!is_int($var))?{
????????return?array(-1,?'参数1必须是整数');
????}
????if?($var?<=?0)?{
????????return?array(-2,?'参数1必须大于0');
????}
????return?$var;
}
这样的函数使用非常不方便。使用者需要通过判断函数的返回值,来确保程序是否正常运行。额外的逻辑判断,会降低程序的可读性。
假如函数被修改为这样:
function?foo($var)?{
????if?(!is_int($var))?{
????????return?array(-1,?'参数1必须是整数');
????}
????if?($var?<=?0)?{
????????return?array(-2,?'参数1必须大于0');
????}
????return?array($var,?'');
}
这时你外层的判断逻辑就需要修改,是不是很麻烦?
使用异常,在执行失败时抛出异常,可以让函数的输出非常干净,避免额外的处理。减少了代码量,也增强了程序的可维护性。
三、使用异常有助于我们集中处理错误。
在程序抛出异常时,只要没有遇到try catch,异常会逐渐向函数调用堆栈顶层传递。这样我们不需要每一层都处理错误。我们可以在程序的入口处集中处理所有未处理的异常,有助于我们发现潜在的程序BUG。而一个只会返回正常处理结果和错误代码的函数,在其出错时不得不立即处理。如果我们想在代码顶层再处理这个错误,就不得不一层一层返回这个错误,给程序设计带来很多不便。
综上,我们应该尽量使用异常,保证程序的可靠性。
PHP中处理异常有几种方式?请详述php中异常处理方法总结:
当异常被触发时,通常会发生:
在PHP5中添加了类似于其它语言的错误异常处理模块。在 PHP代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的 catch。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常。当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
1、异常类的层级关系:
代码如下 复制代码
class NotFoundException extends Exception{}
class InputException extends Exception{}
class DBException extends Exception{}
2、配置未捕捉异常的处理器:
代码如下 复制代码
function exception_uncaught_handler(Exception $e) {
header('Content-type:text/html; charset=utf-8');
if ($e instanceof NotFoundException)
exit($e->getMessage());
elseif ($e instanceof DBException)
exit($e->getMessage());
else
exit($e->getMessage());
}
set_exception_handler('exception_uncaught_handler');
3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器
代码如下 复制代码
exception_uncaught_handler()函数处理:
$this->resConn = mysql_connect ($CONFIGS['db_host'], $CONFIGS['db_user'], $CONFIGS['db_pwd']);
if (false == is_resource($this->resConn))
throw new DBException('数据库连接失败。'.mysql_error($this->resConn));
4、业务逻辑一瞥:
if (0 != strcmp($curAlbum->interest_id, $it))
throw new NotFoundException('很抱歉,你所访问的相册不存在');
以上就是PHP自定义异常处理器的具体使用方法
实例
代码如下 复制代码
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example测试数据";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
例子解释:
上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常:
1.customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
2.创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
3.执行 "try" 代码块,在第一个条件下,不会抛出异常。
4.由于 e-mail 含有字符串 "example",第二个条件会触发异常。
5."catch" 代码块会捕获异常,并显示恰当的错误消息
如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常。
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 "catch" 代码块中再次抛出异常。
代码如下 复制代码
<?php
/*
*/
/*
* 总结:PHP异常的使用方法分三步:
* 第一步:定义异常类,如果不定义就用系统默认的异常类;
* 第二步:当出现异常时用 throw 抛出异常,例如 ex1($num2);异常的参数是$num2用该异常的getMessage()获取;
* 第三步:触发异常,用try子句,当满足条件时 throw new ex1($num);
* 第四步:catch捕获异常 catch (ex2 $e),相当于实例化一个定义好的异常类ex2为$e;
*
* 注意,异常可以定义多个,但是只能触发一个,也就是说只能用catch捕获一个异常
*/
//================基本异常类
//创建可抛出一个异常的函数
function num($num){
if ($num>1){//异常抛出条件
$msg=”数值不能大于1″;//异常提示信息
throw new Exception($msg);//抛出异常
}
echo “数值小于1″;
}
//在 “try” 代码块中触发异常
try {
num(3);
echo “执行正常”;
}
//捕获异常
catch (Exception $e){
echo “错误信息:”.$e->getMessage();//Exception()的系统方法获取异常信息
echo “错误文件:”.$e->getFile();//Exception()的系统方法获取异常文件名
echo “行数:”.$e->getLine();//Exception()的系统方法获取异常行数
}
//======================================================================
echo “<br>========================================================<br>”;
//扩展基本异常类
function checkEmail($email){//定义一个可以抛出异常的判断EMAIL合法性的函数
if (filter_var($email,FILTER_VALIDATE_EMAIL)==false){
throw new checkEmailException($email);//抛出异常用EMAIL做参数
}
echo “邮件合法”;
}
class checkEmailException extends Exception{//定义扩展异常类
public function errormsg(){
$msg=”错误原因:”.$this->getMessage().”不是一个合法的EMAIL地址!”;
$msg.=”错误文件名:”.$this->getFile();
$msg.=”错误行数:”.$this->getLine();
echo $msg;
}
}
$email=”email…..@chhua测试数据“;
try {//触发异常
checkEmail($email);
}
//捕获异常
catch (checkEmailException $e){
$e->errormsg();
}
//==================================多个异常的捕获
echo “<br>===================================================<br>”;
class ex1 extends Exception{//定义一个异常类
public function msg(){
$msg=”错误原因:”.$this->getMessage().”大于100<br>”;
$msg.=”错误文件:”.$this->getFile().”<Br>”;
$msg.=”错误代码:”.$this->getCode().”<br>”;
$msg.=”行数:”.$this->getLine().”<br>”;
echo $msg;
}
}
class ex2 extends Exception{//定义一个异常类
public function msg(){
$msg=”错误原因:”.$this->getMessage().”等于100<br>”;
$msg.=”错误文件:”.$this->getFile().”<Br>”;
$msg.=”行数:”.$this->getLine().”<br>”;
echo $msg;
}
}
$num2=100;
try {
if ($num2>100){//当条件满足时触发
throw new ex1($num2);
}
if ($num2==100){//当条件满足时触发
throw new ex2($num2);
}
}
catch (ex2 $e){//捕获触发的异常
$e->msg();
}
catch (ex1 $e){//捕获触发的异常
$e->msg();
}
/*
* 总结:PHP异常的使用方法分三步:
* 第一步:定义异常类,如果不定义就用系统默认的异常类;
* 第二步:当出现异常时用 throw 抛出异常,例如 ex1($num2);异常的参数是$num2用该异常的getMessage()获取;
* 第三步:触发异常,用try子句,当满足条件时 throw new ex1($num);
* 第四步:catch捕获异常 catch (ex2 $e),相当于实例化一个定义好的异常类ex2为$e;
*
* 注意,异常可以定义多个,但是只能触发一个,也就是说只能用catch捕获一个异常
*/
?>
关于php异常分级别的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php异常分级别 php定义的异常的详细内容...