2012-11-30 68 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