全面的知识请参考: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 = "[email protected]"; 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 = "[email protected]"; 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++更是福音了,可以用返回值返回数据了。
想使用异常,显然要懂得怎么进行继承,异常类有哪些方法,继承体系,内置一些异常类型等。 剩下的就是多用了。