回复[请问一些异常抛出的问题,谢谢了]

aessjz
try
{
 
  if($passwd!=$passwd2)
  {
    throw new exception('the passwords you entered do not same');
  }
 
  if(strlen($passwd) <5)
  {
    throw new exception('your password must be at least 6 characters long');
  }

----------A1----------
  register($username,$email,$passwd)
  $_SESSION['valid_user'];=$username;
  do_html_header('registation successful');
  echo "your registration was successful. go to the members page";
  do_html_url("member.php","go to members page");
----------A1---------
}
catch (exception $e)
{
  do_html_header(problem);
  echo $e->getmessage();
  do_html_footer();
  exit;
}

我有几个问题
1。try中有多个throw,请问会全部抛出吗,还是出现一个异常后,终止下面的异常判断?
2。如果有异常,那么try中A1 部分的代码还会执行吗?
3。catch中的 $e是exception类的一个对象,那这个对象又是在那里创建的,难道说“(exception $e)“这样就可以创建对象了吗?
4。如果没有异常,那么是不是就不执行catch,这样就相当于是个判断。

我看得是一本MYSQL+PHP的书,书里的这个章节将的不清楚,所以还有诸多不明白的地方,谢谢高人,问题很多,麻烦了


___________________________________________________________________



1.throw之后异常就会抛出,直接抛向catch (exception $e) 并执行其区块内的处理.
  throw后面一直到catch之前的处理都会跳过。
2.参考1。
  如果是你上面跑出的异常,就不会被执行
3.$e这个对象的实现,应该是在throw new exception('XXX');的时候被创建的。
4.可以这么理解,因为效果是相似的。
  但是,异常的机制跟简单的if判断不同,它应该是由Zend引擎即时监视的。发上什么异常、之后怎么处理,都应该是由Zend引擎直接控制,理论上,要比在程序中判断错误的效率高。而且,实际的程序设计中,异常更容易管理。
5.try里面是正常处理,catch是被预见的异常处理,通过不同的Exception可以具体到不同异常的各个处理环节
6.异常就是正常之外的处理。
  很多时候,正常与否是由程序员自己定义的。
  例如,一个参数,如果是空那么就要抛出异常,但是根据情况的不同,也可以不抛出异常,具体情况具体定。
7.catch的排列顺序是有规律的,就是从小到大。
例如,IOException是Exception的子类,那么在排序的时候如下。
  1. try{
  2.  if(true){
  3.   throw new IOException();
  4.  }
  5.  throw new Exception();
  6. }catch(IOException $e){
  7. }catch(Exception $e){
  8. }
如上,throw new IOException();之后,就会跳入catch(IOException $e)的处理,但是,如果catch(IOException $e)里面没有提示的话,将不会进入catch(Exception $e)
但是,throw new Exception();之后,肯定进入catch(Exception $e)而不会光顾IOException

___________________________________________________________________



引用 5 楼 aessjz 的回复:
非常感谢朋友的解释,就是最后一点还需要明确一下,如果有多个throw,多个catch,那么throw抛出后会执行哪个catch是有throw中抛出的对象实力决定的。

同时还有个问题,看到有的例子中没有try,catch而直接使用throw,
eg:
if($new_password==false)
throw new Exception('Could not generate new password.');


这就是说throw可以单独使用,我不太理解,在这里使用throw的意义,毕竟没有了catch就没有了预定义的操作,这使…

这种情况是直接向方法的上层抛异常。
也就是,具体的异常处理方法内不考虑,让使用方法的人确定。
这样可以让方法的使用更加灵活。
大多数底层类(如框架中的类)都有这样的处理。

异常的目的是告诉使用方法/类的程序员,用了之后会有什么样的异常发生。
这样,等到发生了异常之后,是用方就可以更容易控制程序的运行。
试想,倘若不用异常,而用返回值判断,那将是一件非常繁琐的事情。

PHP的语法不是很严密,没有一定OOP经验的人可能很难看出,
但是,这种在程序中定义异常的代码效率要比通过返回值判断错误与否高得多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值