PHP 15:异常

原文:PHP 15:异常

看完了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 <?php
 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().‘<br/>‘;
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().‘<br/>‘;
11     
12 }
13 class user_defined_exception extends Exception
14 {
15     public function __toString()
16     {
17         return ‘<table border><tr><td>
18               <strong><font color=red>Exception ‘.$this->getCode().‘:‘.$this->getMessage().‘in‘.$this->getFile().‘on line‘
19            .$this->getLine().‘</font></strong></td?</tr></table>‘;
20     }
21 }
22 ?>

输出为:

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

总结,本章讨论了PHP异常的特点,与其他语言的一些不同之处。最后还介绍了自定义的异常。

时间: 2024-08-06 20:06:03

PHP 15:异常的相关文章

15 异常

什么是异常: 中断了正常指令流的事件 class Test { public static void main(String args[]) { System.out.println(1); try { System.out.println(2); int i=1/0; System.out.println(3); } catch(Exception e) { e.printStackTrace(); System.out.println(4); } finally {//here must r

Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15

java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为复杂的布局.这时就需要用到BaseAdapter中的getViewTypeCount()和getItemViewType(int position) 方法了,在发送复杂界面时出现了这个异常. 令人抓狂的是这个异常居然是UncaughtException,根本无法判断哪一行出错了,刚开始的时候觉得一定

异常小案例

题目要求:对年龄赋值进行判断,不在1-100抛出异常并处理 1 package demo2; 2 3 /** 4 * 人类,对年龄赋值进行判断,不在1-100抛出异常并处理 5 * @author 6 * 7 */ 8 public class Person { 9 private int age; 10 11 public int getAge() { 12 return age; 13 } 14 15 //异常声明 16 public void setAge(int age) throws

Delphi的面向对象编程基础笔记

1.面向对象.一门面向对象的编程语言至少要实现以下三个OOP的概念 封装:把相关的数据和代码结合在一起,并隐藏细节.封装的好处是利用程序的模块化,并把代码和其他代码分开 继承:是指一个新的类能够从父类中获取属性和方法,这种概念能够用来建立VCL这样的多层次的对象,首先建立通用对象,然后创建这些通用对象的有专用功能的子对象.继承的好处是能够共享代码 多态性:从字面上看,是指多种形状.调用一个对象变量的方法时,实际被调用的代码与实际在变量中的对象的实例有关. 2.Object Pascal不像C++

超全面的.NET GDI+图形图像编程教程

本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了分享给大家,纯手工码了好几天的字,喜欢的表忘了点赞哦~给点小小的动力~ 目录: <GDI+绘图基础> 1 GDI+概述 2 Graphics类 2.1 Graphics类的方法成员 2.2 引用命名空间 3 常用画图对象 3.1 Pen类 3.2 Color结构 3.3 Font类 3.4 Bru

Visual Studio高级调试技巧

1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持汇编) _asm int 3 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows API DebugBreak(); WerFault.exe进程(Windows Error Reporting)弹出ConsoleTest.exe已停止工作: 要想出现“调试程序”选项,需要将Windows Error Reporting注册表信息设置成如下图所示(注:特别是红框的内容)

python入门(1)

Python是通过python解释器执行的. 1.第一个python程序 print "hello world" # 存为hello.py文件 如何运行?在命令行下执行python hello.py执行即可. 2.变量和算数表达式 principal = 1000                         # python是弱类型语言,变量声明之前不用指定类型 rate = 0.5 numyears = 5 year = 1 while year <= numyears: 

Java日志规范

前言 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是如何在Java程序里写好日志. 一般来说日志分为两种:业务日志和异常日志,使用日志我们希望能达到以下目标: 对程序运行情况的记录和监控: 在必要时可详细了解程序内部的运行状态: 对系统性能的影响尽量小 Java日志框架 Java的日志框架太多了... Log4j 或 Log4j 2 - Apache的开源项目,

java.lang.IllegalArgumentException: n must be positive

public static String randomKey(){ Random random = new Random(); int key = random.nextInt(((int)System.currentTimeMillis())); return String.valueOf(key); } 直接调用方法,发生异常: Exception in thread "main" java.lang.IllegalArgumentException: n must be posi