从try / catch块中断

时间:2013-05-09 19:27:12

标签: php exception try-catch

这可以在PHP中使用吗?

try {

  $obj = new Clas();

  if ($obj->foo) {
    // how to exit from this try block?
  }

  // do other stuff here

} catch(Exception $e) {

}

我知道我可以将其他内容放在{}之间,但是这会增加对更大代码块的缩进,我不喜欢它:P

8 个答案:

答案 0 :(得分:15)

当然是goto

try {

  $obj = new Clas();

  if ($obj->foo) {
    goto break_free_of_try;
  }

  // do other stuff here

} catch(Exception $e) {

}
break_free_of_try:

答案 1 :(得分:10)

嗯,没有理由这样做,但你可以在try块中强制执行异常,停止执行你的函数。

try {
   if ($you_dont_like_something){
     throw new Exception();
     //No code will be executed after the exception has been thrown.
   }
} catch (Exception $e){
    echo "Something went wrong";
}

答案 2 :(得分:5)

我也遇到过这种情况,和你一样,不想要无数if / else if / else if / else语句,因为它会降低代码的可读性。

我最终用自己的扩展了Exception类。下面的示例类用于验证问题,触发时会产生不太严重的“日志通知”

class ValidationEx extends Exception
{
    public function __construct($message, $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }

    public function __toString()
    {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }
}

在我的主要代码中,我称之为

throw new ValidationEx('You maniac!');

然后在Try语句结束时我有

        catch(ValidationEx $e) { echo $e->getMessage(); }
        catch(Exception $e){ echo $e->getMessage(); }

对于评论和批评感到高兴,我们都在这里学习!

答案 3 :(得分:3)

难道你不能这样做吗?

try{

  $obj = new Clas();

  if(!$obj->foo){
  // do other stuff here
  }


}catch(Exception $e){

}

答案 4 :(得分:2)

try
{
    $object = new Something();
    if ($object->value)
    {
        // do stuff
    }
    else
    {
        // do other stuff
    }
}
catch (Exception $e)
{
     // handle exceptions
}

答案 5 :(得分:0)

在php 5.3+中,使用try catch块使用异常的好处是你可以制作自己的异常,并在需要的时候处理它们。请参阅:Extending Exceptions

class AcceptedException extends \Exception 
{
    //...
}

然后,您可以捕获特定的异常或使用if ($e instanceof AcceptedException)块中的catch \Exception来确定您希望如何处理异常。

  1. 处理示例:http://ideone.com/ggz8fu
  2. 未处理的示例:http://ideone.com/luPQel
  3. try {
        $obj = (object) array('foo' => 'bar');
        if ($obj->foo) {
            throw new \AcceptedException;
        }
    } catch (\AcceptedException $e) {
        var_dump('I was accepted');
    } catch (\Exception $e) {
        if ($e instanceof \InvalidArgumentException) {
            throw $e; //don't handle the exception
        }
    }
    

    与大量替代解决方案相比,这使您的代码更易读,更容易排除故障。

答案 6 :(得分:0)

我个人喜欢使用a

退出try / catch语句
throw new MyException("optional message", MyException::ERROR_SUCCESS);

我显然是通过使用以下方法捕获的:

switch($e->getCode()) {
   /** other cases make sense here */
   case MyException::ERROR_SQL:
       logThis("A SQL error occurred. Details: " . $e->getMessage());
   break;

   case MyException::ERROR_SUCCESS:
       logThis("Completed with success. Details: " . $e->getMessage());
   break;

   case MyException::ERROR_UNDEFINED:
   default:
       logThis("Undefined error. Details: " . $e->getMessage());
   break;
}

答案 7 :(得分:0)

我就是这样做的:

<?php
echo 'this' . PHP_EOL;
switch(true) {
    default:
        try {
            echo 'is' . PHP_EOL;
            break;
            echo 'not' . PHP_EOL;
        } catch (Exception $e) {
            // error_log($e->getMessage());
        }
}
echo 'fun !';

:-)