PHP mysqli异常跳过内层catch块仅被最外层捕获问题咨询
问题:MySQLi严格模式下异常跳过内层catch块直接被最外层捕获
场景还原
- 执行INSERT语句的MySQLi调用:
$result = $this->mysqli->query($query),触发唯一键冲突错误:Duplicate entry 'dt' for key 'username_UNIQUE' - 已开启MySQLi严格报错模式:
\mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); - 调用栈深度约8层,沿途包含多个try-catch块,但异常未被任何内层catch捕获,仅被最外层index.php的catch块处理。
相关代码示例
index.php 代码
<?php define('DS',DIRECTORY_SEPARATOR); define('APP_START',microtime(true)); define('ROOT_DIR',dirname(__FILE__).DS); define('FW_DIR',sprintf("%svendor%sfw%s",ROOT_DIR,DS,DS)); define('APP_DIR',sprintf( '%sapp%s',ROOT_DIR,DS)); try { // set up the autoloader require sprintf('%sbootstrap%sbootstrap.php',FW_DIR,DS); // next, set up the factory for all future class instantiation $factory = new fw\\factory\\ClassFactory(); // create the app $app = $factory->getClass('app\\app'); // process the request $ob = ""; $result = $app->go(); // return anything in the output buffer then the application output echo $ob.$result; } catch (Exception $e) { die("Caught Exception in index.php: ".$e->getMessage()); }
排查确认:代码执行进入$app->go(),但未到达echo $ob.$result;行。
App类代码
<?php namespace app; class App extends \\fw\\app\\App { protected $trace = false; public function __construct(protected \\fw\\exception\\ErrorHandler $errorhandler, protected \\fw\\session\\WebSession $session, protected \\app\\http\\RequestHandler $requesthandler, protected \\database\\MySqlDB $db ) { parent::__construct(); } public function go(){ try { $this->requesthandler->init($this->errorhandler,$this->session,$this->db); $result = $this->requesthandler->processrequest(false); } catch (Exception $e) { die(__METHOD__.": ".$e->__toString()); } return $result; } }
排查确认:代码执行进入$this->requesthandler->processrequest(false);,经过多层方法调用后触发INSERT语句的异常。
异常表现
最终输出内容为:Caught Exception in index.php: Duplicate entry 'dt' for key 'username_UNIQUE',说明异常仅被index.php的最外层catch块捕获,未触发App类或其他内层的catch逻辑。
核心疑问
为什么异常会跳过调用栈中所有内层的try-catch块,直接被最外层的index.php catch块处理?
内容的提问来源于stack exchange,提问作者Nikkorian
相关产品推荐
相关产品推荐

