佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 881|回复: 5

PHP的异常处理

[复制链接]
发表于 4-12-2007 07:05 PM | 显示全部楼层 |阅读模式
想知道到底Exception class比平常的if{异常}then{处理}到底有什么优势?
  1. function fx($a = 0, $b = 0)
  2. {
  3.     if($b == 0)
  4.     {
  5.         throw new Exception('Division by zero.');
  6.     }
  7.    return $a / $b;
  8. }

  9. try {
  10.    fx(10, 0);
  11. } catch (Exception $e) {
  12.     echo '异常: ',  $e->getMessage(), "\n";
  13. }
复制代码
比起 if{异常}then{处理}的方法好像更加的意大利面代码
  1. function fx($a = 0, $b = 0)
  2. {
  3.     if($b == 0)
  4.     {
  5.        echo 'Division by zero.';
  6.         return;
  7.     }
  8.    return $a / $b;
  9. }

  10. fx(10, 0);
复制代码
感觉上用Exception 就好象在用goto
以下的代码纯属概念,必不能在PHP编译器上执行.
  1. function fx($a = 0, $b = 0)
  2. {

  3.     if($b == 0)

  4.     {
  5.         goto 'exception';

  6.     }

  7.    return $a / $b;

  8. }



  9. fx(10, 0);
  10. echo "goto的小小概念\n";

  11. case 'exception':
  12. echo 'Division by zero.';
复制代码
如果我要捕捉这样的异常,应该如何写?
  1. class test
  2. {
  3.     public function fx()
  4.     {
  5.         return 0;
  6.     }
  7. }

  8. $a = new test();
  9. unset($a);

  10. $a->fx(); //PHP编译器会在这里丢fatal error
  11. /*
  12. Notice: Undefined variable: a in c:\php\test.php on line 46
  13. Fatal error: Call to a member function fx() on a non-object in c:\php\test.php on line 46
  14. */
复制代码
难道要每一次call method之前做if{异常}then{处理}?

[ 本帖最后由 megablue 于 4-12-2007 07:12 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 4-12-2007 07:22 PM | 显示全部楼层
对我而言, try catch 只是说,真的遇到 异常时, 不希望 program 直接死掉,然后可以继续跑弥补或retry 程序,

因为异常往往是 unexpected的, 尤其是 user input,

如果你能用 if  来 cover up 所有的可能性, 那就用 if 咯, 如果 还是有些真的预想不到的 异常,还是用 try catch 好了,

或是说,如果 你catch 了 也是反正 结束掉 program的 话, 那放不放都没分别,只是放了死的比较好看而已。。
回复

使用道具 举报

 楼主| 发表于 4-12-2007 07:26 PM | 显示全部楼层
原帖由 tensaix2j 于 4-12-2007 07:22 PM 发表
对我而言, try catch 只是说,真的遇到 异常时, 不希望 program 直接死掉,然后可以继续跑弥补或retry 程序,

因为异常往往是 unexpected的, 尤其是 user input,

如果你能用 if  来 cover up 所有的可 ...


对...我也是...
有些重要的任务,并不能让那个程式直接死掉....至少不能让那个程式死得不明不白...
所以才要catch...但是...fatal error在PHP里是catch不到的(个人意见,我不会catch).

补充:
问题是...就算是用try{}catch{}你也要throw excepetion..
throw exception就要用到if...不让你哪知道有exception (尤其是fatal error, 其他的突变因素你还可用set_error_handler来处理)?

补充2:
刚刚想到了一个可能行得通的方法。
就是在fatal error 发生前, 捕捉fatal error的预兆,预先做出补救动作.

补充3:
之前的想法行不通...
捉不到从undefined/non object call method 的error.
最多能捉到undefined variable.

补充4:
算了, 写个proxy function 来call method. 如果method不存在就可以throw exception 了.

[ 本帖最后由 megablue 于 4-12-2007 10:39 PM 编辑 ]
回复

使用道具 举报

发表于 4-12-2007 10:35 PM | 显示全部楼层
原帖由 tensaix2j 于 4-12-2007 07:22 PM 发表
对我而言, try catch 只是说,真的遇到 异常时, 不希望 program 直接死掉,然后可以继续跑弥补或retry 程序,

因为异常往往是 unexpected的, 尤其是 user input,

如果你能用 if  来 cover up 所有的可 ...


哈!我也是这样做的。
用 if 来 limit user 或 你可以用js来做

但是。。。如果你是用js的话,你就要小心点了
回复

使用道具 举报

 楼主| 发表于 4-12-2007 10:44 PM | 显示全部楼层
原帖由 小陈陈 于 4-12-2007 10:35 PM 发表
哈!我也是这样做的。
用 if 来 limit user 或 你可以用js来做
但是。。。如果你是用js的话,你就要小心点了


Javascript的objects大部分多有built in 的 throw exceptions. PHP不同....所有的exceptions 都要自己设定...
回复

使用道具 举报

发表于 6-12-2007 10:14 PM | 显示全部楼层
原帖由 megablue 于 4-12-2007 10:44 PM 发表


Javascript的objects大部分多有built in 的 throw exceptions. PHP不同....所有的exceptions 都要自己设定...


对啊

但是要顾到的是。。。user可能用FF, opera....IE6.. IE7的
回复

使用道具 举报

Follow Us
您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 21-9-2025 09:00 PM , Processed in 0.138466 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表