这可以在PHP中使用吗?
try {
$obj = new Clas();
if ($obj->foo) {
// how to exit from this try block?
}
// do other stuff here
} catch(Exception $e) {
}
我知道我可以将其他内容放在{}
之间,但是这会增加对更大代码块的缩进,我不喜欢它:P
答案 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
来确定您希望如何处理异常。
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 !';
:-)