全面的知识请参考:http://www.w3school.com.cn/php/php_exception.asp
下面是自己的一点认识:
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...com";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch(Exception $e) {
echo "hi";
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
如果仅仅是throw new Exception(....). 说明并不想区分不同的异常。在大范围里面catch,并不知道是谁产生的(当然了,这不对,因为上面的程序getline,getfile可以知道在哪里发生的异常)。但是,如果不区分,那么就无法对不同类型的异常进行分别处理。不能区分是普通的错误,还是致命错误。
如果想区分,则需要定义不同的异常类型。可以自定义。上面的代码体现了。
try一次可以catch多次。父类异常可以接受子类异常。所以多个catch的排列,应该是子类的放在前面。如果把子类放在后面,子类永远别想catch。
catch处理程序里面可以重新抛出任意类型异常。
多个try可以嵌套。整体一个try。内部还可以进行细致的try处理。内部能解决的错误,就不抛出到全局解决。
原则:有抛出,就必须捕获。
更完整体现php 异常的代码如下:
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e)
{
//re-throw exception
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
ps:
php使用返回值表征程序是否错误,想对于c++有一个优势。php不严格区分类型。返回出错return -1。 如果没有出错,则正常返回数据。这样可以根据是否为-1来判断程序是否出错(当然如果返回结果有可能为-1,要另外处理)。在c++是不可能这样的。要么返回数据,要么返回出错代码。导致了c++如果想通过返回值进行判断出错的话,只好将正真想要得到的数据,放到参数列表中。导致了不方便。
php虽然有这个天然的优势,但是利用返回值其实还是有诸多不便。最里面的那层出错,返回-1.后面的每层都要继续传递这个值。虽然也不难,原本也需要这样做。但是可能更加容易出错。而如果是抛出异常的话,那么就直接搞定了。不用在每层使用数据的时候判断一下是否-1(因为如果是-1,那么早就被throw了)。这样就会逻辑更加清晰一些。耦合度降低。对c++更是福音了,可以用返回值返回数据了。
想使用异常,显然要懂得怎么进行继承,异常类有哪些方法,继承体系,内置一些异常类型等。 剩下的就是多用了。