注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

简单说说PHP、Python的异常(错误)处理  

2012-08-16 17:56:12|  分类: Web技术-应用研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
内建的异常处理类

对于PHP和Python都有一个基本的内置的异常处理类:Exception(用户自己定义的异常类都应从此类继承)

当然 ,Python中还内建立了其它的异常处理类:LookupError(索引或者键超出),EOFError(对内建input函数无法读到任何数据(EOF)触发,注:file.read() 和file.readline()读到文件EOF时,返回空字符串),IOError(I/O操作错误时触发如:文件找不到)等等

===========================PHP中你可以这样来处理异常============================

1 try..catch...

try {
   //试运行PHP代码
} catch (Exception $e) {        //捕获异常,这里Exception是内建的异常类,变量$e是该异常类的一个对象
      //处理异常代码
}

2 抛出(触发)异常

在PHP中你可以这样来抛出(触发)异常:

throw new Exception('Uncaught Exception'); //抛出异常

3 set_exception_handler

当然除了使用try/catch外,你也可以通过set_exception_handler(callback $exception_handler)来设置自己异常处理方法。

如:


set_exception_handler('exception_handler');//自定义异常处理方法

throw new Exception('Uncaught Exception'); //抛出异常

function exception_handler($exception) {

      $exception->getMessage();                // 返回异常信息

      $exception-> getCode();                   // 返回异常代码
      $exception-> getFile();                   // 返回发生异常的文件名
      $exception->getLine();                   // 返回发生异常的代码行号
      $exception->getTrace();                  // backtrace() 数组
     $exception->getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

}


当有异常被抛出时并且没有被 try/catch捕获,则会执行 exception_handler()方法后程序停止运行。

另外以上get_Message(),getCode(),getTrace()等方法都是内建异常类Exception已有的方法


4 继承

因为Exception是一个基类,所以你可以定义自己的异常处理类来继承它。如:(来至手册)


class MyException extends Exception
{
    // 重定义构造器使 message 变为必须被指定的属性
    public function __construct($message, $code = 0) {
        // 自定义的代码
        // 确保所有变量都被正确赋值
        parent::__construct($message, $code);
    }
    // 自定义字符串输出的样式
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }
    public function customFunction() {
        echo "A Custom function for this type of exception\n";
    }
}

//调用自定义异常处理类

try {
   throw new MyException('1 is an invalid parameter', 5);
} catch (MyException $e) {      // 捕获异常
    echo "Caught my exception\n", $e;
    $e->customFunction();
} catch (Exception $e) {        // 被忽略(注意:捕获异常的种类只能和抛出异常的种类一致的时候能起作用)

                                              //即如果try里面是: throw new Exception('1 is an invalid parameter'); 则这里就能捕获
    echo "Caught Default Exception\n", $e;
}



5关于finally

  这里值得一提的是PHP5.5中会有这一新特性(此由Laruence大牛的提交,参看:http://www.laruence.com/2012/08/16/2709.html)。

   文章中这段话要注意:"

对于finally来说, 一个比较容易让人迷惑的地方就是在finally中return, 因为finally必须保证一定被执行, 所以如果我们在try中return了, finally也会被调用, 那么如果finally也return呢? 到底最后的return的值是那个呢? 在PHP中来说, 如果在finally中return, 那么就会覆盖原有的return值.

"

<?php
function anonymous() {
try {
return 1;
} finally {
return 2;
}
}

var_dump(anonymous());
#输出 int(2)

实际上Python finally中的return也是同样的作用(见后面)。

6 set_error_handler

fc_lamp 提醒你:特别要说明的是:异常与错误是不同的两个概念不要混淆了。

与自定义异常处理类似,PHP也允许你自定义错误处理方法。通过set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )即可进行设置,第二个参数$error_types指的是:处理错误的级别。

如:(来至手册)


// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)

  //第一个参数 $errno 指的是:错误的级别号(为整型)

 //第二个参数 $errstr 指的是:错误的信息(为字符串)

 //第三个参数 $errfile 指的是:错误所在的文件(为字符串,另外此参数可选)

 //第四个参数 $errline 指的是:错误所在的行号(为整型,另外此参数可选)

 //实际上还有第五个参数 $errcontext 指的是:错误发生时所有的变量(为数组,另外此参数可选并且自定义错误处理方法是不能修改里的内容的)
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }
    switch ($errno) {
    case E_USER_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        echo "  Fatal error on line $errline in file $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Aborting...<br />\n";
        exit(1);
        break;
    case E_USER_WARNING:
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
        break;

    case E_USER_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;

    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }
    /* Don't execute PHP internal error handler */
    return true;
}

set_error_handler("myErrorHandler");




==============================Python中你可以这样来处理异常=================================

 1 try..except...[else]...[finally]....

  else从句与finally从句都不是必须的。

  else:当没有异常发生的时候,else从句将被执行。

  finally:无论异常发生与否的情况下都执行finally里的语句.

try:

  #试运行python代码
except Exception as e:   #捕获异常 注意这里用到as关键字,在3.1版本中使用as来得到对象而非","

    #捕获异常,Exception是内建的异常类,变量e是该异常类的一个对象

    #处理异常错误
else:

     #处理没有异常的情况
finally:

    #始终都被执行的语句

如:


try:
    a = 3
    b = 'ab'
    s = a + b
except Exception as e:
    print("Error:",e)


2 抛出(触发)异常

在Python中你可以这样来抛出(触发)异常:

raise Exception('err'); //抛出异常 raise关键字


3 继承

 因为Exception是一个基类,所以你可以定义自己的异常处理类来继承它。


class myException(Exception): #继承内建的异常类(注意python中类的继承方式)

    msg = ''
    code = 0
    def __init__(self,msg,code): 
        Exception.__init__(self)
        self.msg = msg
        self.code = code
try:
    raise myException('这是一个异常',1)
except myException as e:
    print('异常信息:%s-------->%d'%(e.msg,e.code)) #使用元组方便打印,记得在元组前面加上%

    #注当然用原始的Exception类时,可以e.message 来获取异常信息。



4 使用多个异常类


try:
    s = [1,2,3]
    #print(s[3])用于触发IndexError
    raise Exception('wewr') #当抛出一个异常时,必须有一个except与之对应,否则最终抛给python
except EOFError: #当到达一个文件的末尾时引起
    print('EOF')
except IndexError: #超出序列的范围
    print('Not INDEX')
except Exception as e:
    print(e)
else: #还可以让try..catch块关联上一个else从句。当没有异常发生的时候,else从句将被执行
    print('没有任何异常')


5 finally

用于:无论异常发生与否的情况下都会执行的语句

try:
    s = '';
finally:
    print('ok')

return问题:

def test():
try:
print '这里试着运行'
raise Exception('抛出异常 99')
return 2
except Exception as e:
print unicode(e.message,'utf-8')
return 3
finally:
print 'Finally'
return 5

print test()

#输出:
这里试着运行
抛出异常 99
Finally
5

如果注释掉 #return 5,则输出:
这里试着运行
抛出异常 99
Finally
3


6 一个try多个从句

在一个try块下,你可以同时使用except从句和finally块。如果你要同时使用它们的话,需要把一个嵌入另外一个


try:
    s ='s'
except Exception as e:
    print(e)
else:
    print('ok')
finally:
    print('end')


更多的python内建异常类可参看相关手册


符PHP的异常处理流程

简单说说python,PHP,Ruby的异常(错误)处理 - fc_lamp - @fc_lamp



  评论这张
 
阅读(1416)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017