Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常后将PHP恢复到执行脚本_Php_Try Catch - Fatal编程技术网

异常后将PHP恢复到执行脚本

异常后将PHP恢复到执行脚本,php,try-catch,Php,Try Catch,我有一个php脚本,比如说在执行过程中,脚本抛出一个异常。我希望我的PHP从它停止的地方(抛出异常的地方)恢复 我应该把相同的执行代码放在代码的“catch”部分吗 例如,假设连接到mySQL,由于连接超时而失败 function someCode(){ $pdostmt = $this->prepare($this->sql); if($pdostmt->execute($this->bind) !== false) {

我有一个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的finally部分

try {
  // some crashing code
} catch (Exception $e) {
  //some catch code
} finally {
  //code that will run anyways.
}

首先,我们应该明确,只有在未捕获异常的情况下,异常才是致命的。捕获异常不会停止脚本执行。它只是停止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...";
还有另一种处理未捕获异常的方法,使用。但是,如果不使用try-and-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 */
}

使用PHP4/5寄存器关闭函数


Doc here:

我假设您无法处理抛出的函数中的异常。如果要恢复引发异常的位置,则需要在那里处理异常。其他任何东西都是糟糕的编码,这会导致您或其他项目工作人员的困惑。我们将异常放在树上,因为由于范围问题,我们无法在函数中处理它们

至于你的例子,我将进一步阐述。您说操作无法继续,因为连接无法发生。实际上,我们不想公然地重试该函数,因为我们实际上会创建一个持续尝试连接的挂起点,所以我们使用树上更高的catch块,在那里我们可以通知用户并让他们决定我们要做什么。通过这样做,我们可以在正确的位置使用catch块来保存数据,以便恢复数据并在以后执行。实际上,我们希望在试块之前的某个点结束

这将为您提供更清晰的执行路径。有时,您必须重新考虑函数/方法,以便它正确地完成一件事和一件事

简单而直率地回答你的问题。不,在catch块中调用try(ed)函数不是一个好主意,原因很简单,因为您不再有try块来捕获异常。异常带来了更有意义的错误处理,而不仅仅是传递true和false作为返回。然而,这确实意味着在处理这些问题时,你必须绕开整个循环

现在来看另一个例子。。。假设我们有多个可以连接的服务器,并且您希望运行该列表,您可以将try/catch放在一个循环中,catch将检查该异常,并在执行下一个循环之前进行任何清理。如果发生任何其他异常,我们将(重新)抛出该异常。实现你想要的目标的正确方法是这样的

function someCode() {
    $pdostmt = $this->prepare($this->sql);

    while($status == false) {
        try {
            $status = $pdostmt->execute($this->bind)

        } catch (PDOException $e) {
            if($e->getMessage("What ever the error message is") {
                //Fix it here
            } else {
                throw $e;
            }
        }
    }
    //Do other stuff
    return $data; //or true/false
}

你能举例说明你想做什么吗?也许重构它会有所帮助。代码,或者它没有发生。一个try块可以包含许多语句。可以找出是哪一个触发了异常,但这并不是小事。你想完成什么?还有。。即使在大多数情况下,它是使用它是坏的做法。。。您可以将相同的代码块放在catch中,但这样您就失去了抛出异常的机会,这最终不是PHP5.5中的一个特性(所以实际上没有人还拥有它)?。。。并且它不会从引发异常的确切时间点恢复。它只运行一组硬编码的语句。那么PHP5.5中finally的用途是什么呢?我一直认为它在那里是为了确保捕获后继续执行,而不是停止脚本。@MCHam
finally
的目的是保证代码块将运行,不管是否在
try
块中抛出异常,也不管它是否在
catch
块中处理。FATALIn PHP 5.5+中只有未捕获的异常。如果在try块中有return语句,它仍然会在实际返回之前执行finally块(而如果在catch块之后有代码,则从try块中返回不会执行该代码)。因此,finally块保证无论是否处理异常,也不管try代码是否返回或继续,代码都会被调用。“如果你想继续抛出异常的位置,你需要在那里处理异常。”-对于任何想要tl的人;博士-这是最重要的部分,而且是100%正确的方法。谢谢,这正是我想要的!在别的地方找不到。我在寻找一个全球性的“最终”。在未捕获的异常之后要执行的操作。谢谢