try catch 无法接收到异常?

try catch \Exception 套 try catch \Exception 时,什么情况下,始终是外层 try catch 接收到异常,而里面的 try catch 无法接收到异常?

例:正常情况下这个代码始终是里面的 try catch 接收异常

try catch 无法接收到错误?

光年之外
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

tes() 里面你已经把异常处理了, 想要外层处理就继续抛出去.

4年前 评论

@overfalse 这是正常情况下,代码是这样操作的。 那如果,要直接绕过里面的 try ,直接外面的 try 接收异常呢?这种奇葩呢?

4年前 评论

try catch 是指捕捉 try { }代码块中的异常,比如在 trythrow new exception('error'),并且是一一对应的。
你的代码中 test 方法并没有抛出异常,只是报错的时候 retrun false,所以外部的try catch捕捉不到。

至于你说的内层的不接收异常,那还要try catch干嘛呢,如果是想拿到内层的 exceptionmessage ,可以在里面的 catch {}中再 throw 一个错误,throw new exception($exception->getMessage()) 这样外部就接收到了。

4年前 评论

目前想到两种

  1. catch 完之后再 throw
  2. 新建一个 Exception 类,里层的捕获范围限制的更小一点
4年前 评论

@huazi 主动通过 throw 抛出异常,这也是正常操作执行流程。
直白的说,现在遇到了这种问题,里面的 tes 方法的代码是公用代码,多个地方调用,这个地方代码的异常不能影响正常流程,返回 false 即可,外面的代码是调用方法的地方。 『问题点』:在 A 地 try catch 里面调用 tes 方法, tes 方法的 try 能正常接收异常,在 B 地 try catch 里面调用 tes 方法,异常始终被外面的 try 接收。

4年前 评论

@FreeMason 这种情况应该是 B 的调用方式有问题吧,看下有没有嵌套的数据库事务或者其他的原因,没有具体的代码不好分析。

4年前 评论

@huazi
@振翅飞翔 这种奇葩错误,现在确是只能也直观的定位到 B 调用的地方问题。

通过在 B 把代码段一段一段的注释,通过多次测试验证,问题定位到具体的代码了『$a->decrement('x')』,这代码就在调用 tes 方法前。但是到了这里,也超过了正常情况。decrement 返回的是 1,成功的,而且 x 是可为负的。

测试步骤

1、让 tes 里面的 decrement 始终超过范围,减不成功

2、注释 『$a->decrement('x')』,代码执行成功,正常流程执行,tes 里面的 try 接收到异常返回了 false。

3、打开『$a->decrement('x')』,则出现提问的情况。

测试结果

问题在『$a->decrement('x')』

4年前 评论

正常情况就应该是 tes 捕获了异常,去处理返回了。index 只能拿到返回 false

4年前 评论
lji123123

php7新增了throwable类是可以捕获致命异常的,Exception类无法捕获致命异常的。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!