PHP 15:异常

WBOY
WBOYOriginal
2016-06-23 14:35:24970Durchsuche

看完了out_put_fns.php文件,让我们再看看db_fns.php文件。其代码非常简单,如下:

 1  php
 2 
 3  function  db_connect()
 4  {
 5      $result   =   new  mysqli( ' localhost ' ,   ' bm_user ' ,   ' password ' ,   ' bookmarks ' ); 
 6      if  ( ! $result )
 7        throw   new   Exception ( ' Could not connect to database server ' );
 8      else
 9        return   $result ;
10  }
11 
12  ?>

其作用是连接数据库,并返回一个数据库连接。在这里我们暂且不提数据库连接,因为第7行的代码是抛出一个异常的。所以我们先讨论PHP的异常,然后在下一章节中专门讲解数据库的操作等。
 PHP的异常机制和Java等语言差不多。但是还是有区别的。
PHP的异常同样是以try...throw...catch来捕获异常。
在某些语言,例如C#,Java,try里的代码有的时候会自动抛出异常,但是载PHP中,你必须手动捕获这个异常。和其他语言一样,PHP也会判断合适的异常抛出,那就是后面catch的作用了。
PHO也有异常的类。让我们先看一个例子,代码如下:


 1  2 try
 3 {
 4     throw new Exception('An Exception occurs here!',43);
 5 }
 6 catch(Exception $e)
 7 {
 8     echo 'Exception '.$e->getCode().':'.$e->getMessage().'in'.$e->getFile().'on line'
 9     .$e->getLine().'
';
10     
11 }
12 ?> 

它将输出:

Exception43 : An  Exception  occurs here ! inG : \Apache Group\Apache2 . 2 \htdocs\test . phpon line4

这里我们看到了Exception类的使用。如果你对C#和Java熟悉的话,相信不是很难看懂。
PHP5提供了Exception类,其构造时需要2个参数,一个是异常消息,一个是异常代码。
除了构造函数之外,它还包括以下函数。
getCode()--返回传递给构造函数的代码。 getMessage()--返回给构造函数的消息。 getFile()--返回产生异常的代码的文件的完整路径。 getLine()--返回产生异常代码的行号。 getTrace()--返回一个产生异常的代码以及回退路径,这个和.net里的异常,当你编写一个ASP.NET页面时,如果发生异常,.net会将错误的信息,所在的文件,以及回退路径信息全部提供给你。
getTraceAsString()--与getTrace()一样,只不过它将格式化为字符串。 __toString()--允许简单的显示Exception对象,并且给出所有以上方法给出的信息。  可以调用 echo $e显示所有信息。例如上面的代码如此调用,结果是

exception   ' Exception '  with message  ' An Exception occurs here! '  in G : \Apache Group\Apache2 . 2 \htdocs\test . php : 4  Stack trace :   # 0 {main}

和其他语言一样,PHP也可以自定义Exception类。
幸运的是PHP提供了Exception的代码。让我们一睹为快。

 1  php
 2  class   Exception
 3  {
 4      protected   $message   =   ' Unknown exception ' ;   //  exception message
 5      protected   $code   =   0 ;                         //  user defined exception code
 6      protected   $file ;                             //  source filename of exception
 7      protected   $line ;                             //  source line of exception
 8 
 9      function  __construct( $message   =   null ,   $code   =   0 );
10 
11      final   function  getMessage();                 //  message of exception
12      final   function  getCode();                   //  code of exception
13      final   function  getFile();                   //  source filename
14      final   function  getLine();                   //  source line
15      final   function  getTrace();                   //  an array of the backtrace()
16      final   function  getTraceAsString();           //  formated string of trace
17 
18      /*  Overrideable  */
19      function  __toString();                       //  formated string for display
20  }
21  ?>  

让我们看看这个类,如果我们打算自定义自己的异常,必须从继承这个类。看样子只有__toString可以重写,因为其他的方法都有final关键字,说明子类是没法重写的。看看下面的例子吧:

 1  php
 2  try
 3  {
 4       throw   new  user_defined_exception( ' An Exception occurs here! ' , 43 );
 5  }
 6  catch (user_defined_exception  $e )
 7  {
 8       echo   $e ;
 9       // echo 'Exception '.$e->getCode().':'.$e->getMessage().'in'.$e->getFile().'on line'
10      //.$e->getLine().'
';
11      
12  }
13  class  user_defined_exception  extends   Exception
14  {
15       public   function  __toString()
16      {
17           return   '

?

18                Exception  ' . $this -> getCode() . ' : ' . $this -> getMessage() . ' in ' . $this -> getFile() . ' on line '
19              . $this -> getLine() . '
' ;
20      }
21  }
22  ?>   输出为:
 
Exception 43:An Exception occurs here!inG:\Apache Group\Apache2.2\htdocs\test.phpon line4

总结,本章讨论了PHP异常的特点,与其他语言的一些不同之处。最后还介绍了自定义的异常。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP类继承Nächster Artikel:php函数 ini_set