如何忽略异常并继续运行脚本

时间:2012-11-30 06:54:58

标签: perl

我正在运行一个Vmware脚本,它会在一半时间内通过,然后失败并出现以下错误并退出:

Can't use an undefined value as an ARRAY reference at test.pl line 49

这是在vCetner库存上运行的,该库存有大约4000个VM。所以我希望脚本忽略这些错误并继续运行直到它完成。目前,脚本在出现上述错误后退出任何输出。

这是我的代码,它给了我上面的错误。我只粘贴了几行错误:

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
        print $vm_mo_ref."\n";
}

这是我忽略错误的方法:

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (defined $vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (exists $vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if ($vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (ref($vm_mo_ref) eq "ARRAY")
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (ref($vm_mo_ref) eq "ManagedObjectReference")
    {   
            print $vm_mo_ref."\n";
    }
}

但是,以上五种处理“if”条件的方法都不起作用且我的脚本仍然失败/退出并出现上述错误。

BTW,ManagedObjectReference是Vmware特定的参考。

你能帮助我解决这个错误并继续使用脚本的其余部分。 感谢。

2 个答案:

答案 0 :(得分:5)

尝试

foreach my $vm_mo_ref ( @{ $host_view->vm || [] } )

循环中没有任何改变会产生任何影响,因为你的代码在进入循环之前会抛出异常。

答案 1 :(得分:2)

@{ }抛出错误,所以你的支票来得太晚了。这就是你如何尽早进行检查:

if (my $vm = $host_view->vm)
{
    foreach my $vm_mo_ref (@$vm)
    {
        print $vm_mo_ref."\n";
    }
}

另一种方法是按需创建数组。这有点浪费,但它可以提供清晰的代码。

foreach my $vm_mo_ref (@{ $host_view->vm // [] })
{
    print $vm_mo_ref."\n";
}