php 抛出异常后代码还继续执行,异常后将PHP恢复到执行脚本

我有一个PHP脚本让我们说在执行过程中脚本会抛出异常.我希望我的PHP从它停止的地方恢复(抛出异常的地方).

我应该在代码的“catch”部分放置相同的执行代码吗?

例如,让我们说连接到mySQL它失败了连接超时

function someCode(){

$pdostmt = $this->prepare($this->sql);

if($pdostmt->execute($this->bind) !== false) {

if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))

return $pdostmt->fetchAll($this->fetchOption);

elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))

return $pdostmt->rowCount();

}

try {

someCode();

}

} catch (PDOException $e) {

//re-execute same code as within the try clause?

someCode();

}

解决方法:

首先,应该明确一个例外只有在没有被捕获时才是致命的.捕获异常不会停止脚本执行.它只是停止try块中的堆栈帧并将控制转移到catch块.从那里你的脚本将继续正常执行.

通过捕获异常,我们仍然会在异常被捕获后恢复正常的脚本执行…

try {

echo "Try...\n";

throw new Exception("This is an exception");

} catch(Exception $e) {

echo "Exception caught with message: " . $e->getMessage() . "\n";

}

echo "Script is still running...";

还有另一种方法可以使用exception handler处理未捕获的异常.但是,如果不使用try和catch语句,执​​行流程仍将停止.这是例外的本质:

function myExceptionHandler($e) {

echo "Uncaught exception with message: " , $e->getMessage(), "\n";

}

set_exception_handler('myExceptionHandler'); // Registers the exception handler

throw new Exception("This is Exception 1");

echo "Execution never gets past this point";

throw new Exception("This is Exception 2");

throw new Exception("This is Exception 3");

编辑:澄清你的问题后,我认为我应该说明你想要的不是异常处理程序,但实际上你根本不想使用异常.你要做的事情根本不需要抛出异常.如果您打算做的只是处理这样的错误,请不要将PDO置于异常模式.只应使用异常来处理异常错误.一个例外的重点是确保你遵守诺言.例如,如果您的函数承诺它将始终返回PDOStatement对象,并且存在无法执行此操作的情况,那么抛出异常是有意义的.这让来电者知道我们已经达到了我们无法兑现承诺的程度.

你想要的是基本的错误处理……

function someCode(){

$pdostmt = $this->prepare($this->sql);

if($pdostmt->execute($this->bind) !== false) {

if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))

return $pdostmt->fetchAll($this->fetchOption);

elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))

return $pdostmt->rowCount();

} else {

return false;

}

}

while (someCode() === false) {

/* Call someCode() until you get what you want */

}

标签:php,try-catch

来源: https://codeday.me/bug/20191006/1861515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值