从 try/catch 块中中断

问题描述 投票:0回答:8

这在 PHP 中可能吗?

try {

  $obj = new Clas();

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

  // do other stuff here

} catch(Exception $e) {

}

我知道我可以将其他内容放在

{}
之间,但这会增加更大代码块上的缩进,我不喜欢它:P

php exception try-catch
8个回答
24
投票

当然是goto

try {

  $obj = new Clas();

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

  // do other stuff here

} catch(Exception $e) {

}
break_free_of_try:

13
投票

嗯,没有理由这样做,但是您可以在

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";
}

8
投票

我也遇到过这种情况,和你一样,不想要无数的 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(); }

欢迎评论和批评,我们都是来学习的!


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

4
投票

你就不能这样做吗?

try{

  $obj = new Clas();

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


}catch(Exception $e){

}

3
投票

在 php 5.3+ 中,使用带有 try catch 块的异常的好处是,您可以创建自己的异常并按照您想要的方式和时间处理它们。请参阅:扩展例外情况

class OtherException extends Exception 
{
    //...
}

然后,您可以捕获特定异常或在

if ($e instanceof OtherException)
块中使用
catch \Exception
来确定要如何处理异常。

  1. 处理示例:http://ideone.com/ggz8fu
  2. 未处理的示例:http://ideone.com/luPQel
try {
    $obj = (object) array('foo' => 'bar');
    if ($obj->foo) {
        throw new OtherException;
    }
    /* do stuff */
} catch (OtherException $e) {
    /* do other stuff here and handle exception */
} catch (Exception $e) {
    if ($e instanceof InvalidArgumentException) {
        throw $e; //don't handle the exception
    }
}

与许多替代解决方案相比,这使您的代码更具可读性并且更容易排除故障。
话虽如此,异常应该被视为正常流程之外的意外功能。


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 !';

:-)


-1
投票

我个人喜欢使用 a 来退出 try/catch 语句

throw new MyException("optional message", MyException::ERROR_SUCCESS);

我显然通过使用此代码(在

catch()
语句内)捕获了这一点

catch(MyException $e) {
    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;
    }
}

MyException
只是 Exception 的扩展,它还定义了类常量。

© www.soinside.com 2019 - 2024. All rights reserved.