try catch 无法接收到异常?
try catch \Exception 套 try catch \Exception 时,什么情况下,始终是外层 try catch 接收到异常,而里面的 try catch 无法接收到异常?
例:正常情况下这个代码始终是里面的 try catch 接收异常
tes() 里面你已经把异常处理了, 想要外层处理就继续抛出去.
@overfalse 这是正常情况下,代码是这样操作的。 那如果,要直接绕过里面的 try ,直接外面的 try 接收异常呢?这种奇葩呢?
try catch
是指捕捉try { }
代码块中的异常,比如在try
中throw new exception('error')
,并且是一一对应的。你的代码中
test
方法并没有抛出异常,只是报错的时候retrun false
,所以外部的try catch
捕捉不到。至于你说的内层的不接收异常,那还要
try catch
干嘛呢,如果是想拿到内层的exception
的message
,可以在里面的catch {}
中再throw
一个错误,throw new exception($exception->getMessage())
这样外部就接收到了。目前想到两种
@huazi 主动通过 throw 抛出异常,这也是正常操作执行流程。
直白的说,现在遇到了这种问题,里面的 tes 方法的代码是公用代码,多个地方调用,这个地方代码的异常不能影响正常流程,返回 false 即可,外面的代码是调用方法的地方。 『问题点』:在 A 地 try catch 里面调用 tes 方法, tes 方法的 try 能正常接收异常,在 B 地 try catch 里面调用 tes 方法,异常始终被外面的 try 接收。
@FreeMason 这种情况应该是 B 的调用方式有问题吧,看下有没有嵌套的数据库事务或者其他的原因,没有具体的代码不好分析。
@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')』
正常情况就应该是 tes 捕获了异常,去处理返回了。index 只能拿到返回 false
php7新增了throwable类是可以捕获致命异常的,Exception类无法捕获致命异常的。
最后咋解决的?我也碰到了同样的问题