php异常处理

全面的知识请参考: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++更是福音了,可以用返回值返回数据了。


想使用异常,显然要懂得怎么进行继承,异常类有哪些方法,继承体系,内置一些异常类型等。 剩下的就是多用了。

你可能感兴趣的:(php异常处理)