2012-11-30 72 views
1

我运行VMware的脚本,它会中途再失败,以下错误并退出:如何忽略异常,并继续脚本运行

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

这是运行在具有〜4000个虚拟机的vCetner库存上。所以我希望脚本忽略这些错误并继续运行,直到完成。目前脚本在上述错误之后没有任何输出。

这是我的代码,它给了我上面的错误。其中,该错误出现,我粘贴只有几行字:

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"; 
    } 
} 

and

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"; 
    } 
} 

然而,没有以上五种方法用“如果”条件正在和我的脚本仍然失败/与前面提到的错误退出。

顺便说一下,ManagedObjectReference是Vmware的具体参考。

你能帮我解决这个错误,并继续处理脚本的其余部分。 谢谢。

+2

你用作数组ref的东西是'$ host_view-> vm'。这是你需要检查循环之前的事情。 – Mat

+1

太棒了。请把答案写在答案部分,以便我可以接受。非常感谢您的快速回复。 – slayedbylucifer

+1

也许你应该检查值的原因是未定义的。这就是警告,你知道。 – TLP

回答

5

尝试

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

没有你在循环改变会产生什么影响,因为你的代码抛出一个异常,它甚至进入循环之前。

+1

或者,甚至更好的是,使用定义的或“//”而不是逻辑或“||”。 :) – memowe

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"; 
} 
+0

感谢您的解释。我喜欢你提到的第一个选项。 – slayedbylucifer