1

Ich verwende Powershell, um mehrere verschiedene Websites nach Daten zu überprüfen. Wenn die Site keine Daten für heute enthält, wird eine NullReferenceException ausgelöst. Ich möchte, dass das Skript eine Nachricht ausgibt, dass keine Daten vorhanden sind, und fahre dann mit den anderen Sites fort, ohne anzuhalten.Powershell WebScraping und Terminierung Ausnahmebehandlung

In Java kann ich einfach nur versuchen/fangen/endlich, aber Powershell verhält sich nicht so gut.

try { 

     $webRequest = Invoke-WebRequest -URI "http://###.##.###.##:####/abcd.aspx?" 

    } catch [System.NullReferenceException]{ 

      Write-Host "There is no data" 

    } 

Die vollständigen Fehleranzeigen in der Konsole und die Write-Host nie tatsächlich erscheint.

enter image description here

enter image description here

+0

überprüfen meine Antwort aktualisiert – 4c74356b41

Antwort

1
try { 
    $webRequest = Invoke-WebRequest -URI "http://host/link" -erroraction stop 
} 
catch [System.NullReferenceException]{ 
     Write-Host "There is no data" 
} 

Powershell unterscheidet zwischen Abschluss und nicht Abschlussfehler, für Fang zu arbeiten, müssen Sie die Fehler beendet werden. https://blogs.technet.microsoft.com/heyscriptingguy/2015/09/16/understanding-non-terminating-errors-in-powershell/

UPD: die Art der Ausnahme zu erhalten, nachdem Sie den Fehler nur tun:
$Error[0].Exception.GetType().FullName und Sie, dass nach

, dass bestimmte Fehler fangen

mit invoke-webrequest auf spezifische Fehler fortzusetzen Sie kann folgendes tun:

try { Invoke-WebRequest "url" } 
catch { $req = $_.Exception.Response.StatusCode.Value__} 
if ($req -neq 404) { do stuff } 
+0

habe ich diese Zeile Sie hinzugefügt in der Aktualisierung, um den Fehlertyp zu überprüfen. Natürlich war das NRE tatsächlich eine WebException. Wenn also stop das Programm anhält, könnte ich es so ändern, dass ich still weitermache, wenn ich ein Array von URIs durchlaufen muss? –

+0

normalerweise ja, aber nicht mit invoke-webrequest – 4c74356b41

0

Das liegt wahrscheinlich daran, dass die Ausnahme möglicherweise keine Null Reference-Ausnahme ist. Ich dachte zunächst, dass es sich um einen nicht terminierenden Fehler handelt, aber invoke-webrequest löst einen Abbruchfehler aus.

In diesem Fall können Sie einfach versuchen (ohne eine spezifische Ausnahme Typ Fang)

--Edited Per OP Comments--

try 
{ 
Invoke-WebRequest -URI "http://doc/abcd.aspx?" -ErrorAction Stop 
} 
catch 
{  
    if($_.Exception.GetType().FullName -eq "YouranticipatedException") 
    { 
     Write-Host ("Exception occured in Invoke-WebRequest.") 
     # You can also get the response code thru "$_.Exception.Response.StatusCode.Value__" if there is response to your webrequest 
    }  
+0

Sie hatten Recht - Es war kein NRE. Ich glaube jedoch nicht, dass das blinde Essen der Ausnahme der geeignetste Schritt ist. Vielen Dank für Ihre Hilfe! –

+1

Behandeln Sie dann mit dem entsprechenden Ausnahmetyp oder verwenden Sie einfach $ _. Exception.GetType(). FullName, um Ausnahmeinformationen zu erhalten. –