这在 PHP 中可能吗?
try {
$obj = new Clas();
if ($obj->foo) {
// how to exit from this try block?
}
// do other stuff here
} catch(Exception $e) {
}
我知道我可以将其他内容放在
{}
之间,但这会增加更大代码块上的缩进,我不喜欢它:P
当然是goto!
try {
$obj = new Clas();
if ($obj->foo) {
goto break_free_of_try;
}
// do other stuff here
} catch(Exception $e) {
}
break_free_of_try:
嗯,没有理由这样做,但是您可以在
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";
}
我也遇到过这种情况,和你一样,不想要无数的 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(); }
欢迎评论和批评,我们都是来学习的!
try
{
$object = new Something();
if ($object->value)
{
// do stuff
}
else
{
// do other stuff
}
}
catch (Exception $e)
{
// handle exceptions
}
你就不能这样做吗?
try{
$obj = new Clas();
if(!$obj->foo){
// do other stuff here
}
}catch(Exception $e){
}
在 php 5.3+ 中,使用带有 try catch 块的异常的好处是,您可以创建自己的异常并按照您想要的方式和时间处理它们。请参阅:扩展例外情况
class OtherException extends Exception
{
//...
}
然后,您可以捕获特定异常或在
if ($e instanceof OtherException)
块中使用 catch \Exception
来确定要如何处理异常。
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
}
}
与许多替代解决方案相比,这使您的代码更具可读性并且更容易排除故障。
话虽如此,异常应该被视为正常流程之外的意外功能。
这就是我这样做的方式:
<?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 !';
:-)
我个人喜欢使用 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 的扩展,它还定义了类常量。