是否可以捕获异常并继续执行脚本?
答案 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+,我们可以省略捕获异常的变量名称。
<块引用>从 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)
使用新的界面Throwable
func update(_ currentTime: TimeInterval)