php:捕获异常并继续执行,是否可能?

时间:2010-01-25 14:07:29

标签: php

是否可以捕获异常并继续执行脚本?

8 个答案:

答案 0 :(得分:117)

是的,但这取决于您想要执行的内容:

E.g。

try {
   a();
   b();
}
catch(Exception $e){
}

c();
始终会执行

c()。但如果a()引发异常,则b() 执行。

只将内容放入彼此依赖的try块中。例如。 b取决于a的某些结果,将b放在try-catch块之后是没有意义的。

答案 1 :(得分:83)

当然,只要抓住你想要继续执行的例外......

  try
  {
      SomeOperation();
  }
  catch (SomeException $e)
  {
      // do nothing... php will ignore and continue    
  }

当然这有一个问题,就是默默地放弃这可能是一个非常重要的错误。 SomeOperation()可能会失败导致其他微妙的,难以弄清楚的问题,但你永远不会知道你是否默默地删除异常。

答案 2 :(得分:15)

不确定

try {
   throw new Exception('Something bad');
} catch (Exception $e) {
    // Do nothing
}

您可能希望阅读Exceptions上的PHP文档。

答案 3 :(得分:6)

try {
    Somecode();
catch (Exception $e) {
    // handle or ignore exception here. 
}

然而请注意,php也有与异常分开的错误代码,这是在php拥有oop原语之前的遗留保留。大多数库内置程序仍会引发错误代码,而不是异常。要忽略错误代码,请调用前缀为@:

的函数
@myfunction();

答案 4 :(得分:1)

对于 PHP 8+,我们可以省略捕获异常的变量名称。

<块引用>

catch

从 PHP 8.0.0 开始,捕获异常的变量名是可选的。如果未指定,catch 块仍将执行,但无法访问抛出的对象。

因此我们可以这样做:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
DatabaseReference indexReference =ref.child("postNum");
indexReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if(snapshot.getValue()==null){
            tempIndex = 0;
        }
        else {
            tempIndex =(Long) snapshot.getValue();
            Log.d("read", String.valueOf(tempIndex));
        }
        snapshot.getRef().setValue(tempIndex+1);
        Log.d("temp", String.valueOf(tempIndex));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
    }
});

答案 5 :(得分:0)

另一个角度是从处理代码中返回一个Exception,而不是抛出一个。

我需要用我正在编写的模板框架来做这件事。如果用户试图访问数据上不存在的属性,我从处理函数深处返回错误,而不是抛出它。

然后,在调用代码中,我可以决定是否抛出此返回的错误,导致try()捕获(),或者只是继续:

// process the template
    try
    {
        // this function will pass back a value, or a TemplateExecption if invalid
            $result = $this->process($value);

        // if the result is an error, choose what to do with it
            if($result instanceof TemplateExecption)
            {
                if(DEBUGGING == TRUE)
                {
                    throw($result); // throw the original error
                }
                else
                {
                    $result = NULL; // ignore the error
                }
            }
    }

// catch TemplateExceptions
    catch(TemplateException $e)
    {
        // handle template exceptions
    }

// catch normal PHP Exceptions
    catch(Exception $e)
    {
        // handle normal exceptions
    }

// if we get here, $result was valid, or ignored
    return $result;

结果是我仍然得到原始错误的上下文,即使它被抛到顶部。

另一个选项可能是返回一个自定义NullObject或UnknownProperty对象,并在决定跳过catch()之前与之进行比较,但是你可以重新抛出错误,如果你完全控制整体结构,我认为这是一个不能继续尝试/捕获的问题。

答案 6 :(得分:0)

一个古老的问题,但我过去曾经从VBA scipts转到php,在那里你可以帮助我们#Go; GoTo&#34;重新进入一个循环&#34; On Error&#34;用&#34;简历&#34;然后它仍然处理功能。
在php中,经过一些试验和错误后,我现在使用嵌套的try {} catch {}进行关键与非关键进程,甚至是相互依赖的类调用,这样我就可以追溯到错误的开始。 例如如果函数b依赖于函数a,但函数c是一个很好的但不应该停止这个过程,我仍然想知道所有3的结果,不管怎么样,我在做什么:

//set up array to capture output of all 3 functions
$resultArr = array(array(), array(), array());

// Loop through the primary array and run the functions 
foreach($x as $key => $val)
{
    try
    {
        $resultArr[$key][0][] = a($key); 
        $resultArr[$key][1][] = b($val);
        try
        { // If successful, output of c() is captured
            $resultArr[$key][2][] = c($key, $val);
        }
        catch(Exception $ex)
        { // If an error, capture why c() failed
            $resultArr[$key][2][] = $ex->getMessage();
        }
    }
    catch(Exception $ex)
    { // If critical functions a() or b() fail, we catch the reason why
        $criticalError = $ex->getMessage();
    }
} 

现在我可以遍历每个键的结果数组并评估结果。 如果a()或b()出现严重故障 在$ resultArr中发生严重故障之前,我仍然有一个参考点,如果异常处理程序设置正确,我知道它是否是()或b()失败。
如果c()失败,循环继续。如果c()在各个点失败,有了一些额外的后循环逻辑,我甚至可以通过查询$ resultArr [$ key] [2]来查明c()是否有效或每次迭代都有错误。

答案 7 :(得分:0)

php> 7

使用新的界面Throwable

func update(_ currentTime: TimeInterval)