php 从try/catch块中断

vu8f3i0k  于 2023-08-02  发布在  PHP
关注(0)|答案(8)|浏览(133)

这在PHP中可能吗?

try {

  $obj = new Clas();

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

  // do other stuff here

} catch(Exception $e) {

}

字符串
我知道我可以把其他的东西放在{}之间,但是这会增加更大代码块的缩进,我不喜欢这样:P

n8ghc7c1

n8ghc7c11#

当然是goto

try {

  $obj = new Clas();

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

  // do other stuff here

} catch(Exception $e) {

}
break_free_of_try:

字符串

jmo0nnb3

jmo0nnb32#

好吧,没有理由这样做,但是你可以在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";
}

字符串

6uxekuva

6uxekuva3#

我也遇到过这种情况,和你一样,不希望有无数的if/else if/else if/else语句,因为它会使代码可读性降低。
最后,我用自己的Exception类扩展了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(); }


欢迎评论和批评,我们都在这里学习!

bvpmtnay

bvpmtnay4#

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

字符串

flvlnr44

flvlnr445#

你就不能这样做吗?

try{

  $obj = new Clas();

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

}catch(Exception $e){

}

字符串

stszievb

stszievb6#

在php 5.3+中,使用带有try catch块的异常的好处是,您可以创建自己的异常并以您想要的方式和时间处理它们。参见:Extending Exceptions

class OtherException extends Exception 
{
    //...
}

字符串
然后,您可以捕获特定的异常,或者在catch \Exception块中使用if ($e instanceof OtherException)来确定如何处理异常。
1.处理示例:http://ideone.com/ggz8fu
1.未处理示例: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
    }
}


这使您的代码更具可读性,并且更容易进行故障排除,而不是许多替代解决方案。
也就是说,异常应该被视为正常流程之外的意外功能。

t5zmwmid

t5zmwmid7#

我会这么做

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

字符串
:—)

wnavrhmk

wnavrhmk8#

就我个人而言,我喜欢使用

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

相关问题