2017-04-06 1 views
0

ich die Funktion get_user haben, die für den Benutzernamen sucht getippt:Try/Catch funktioniert nicht in Powershell

function get_user 
{ 
    $url2 = "myurl/userName:" + $userName 

    $contentType2 = "application/json" 
    $basicAuth2 = post_token 
    $headers2 = @{ 
       Authorization = $basicAuth2 
      } 
    $body2 = @{ 
       grant_type = 'client_credentials' 
      } 
    $getUser = Invoke-RestMethod -Method Get -Uri $url2 -ContentType $contentType2 -Headers $headers2 -Body $body2 

    return $getUser.userName 
} 

Und dann habe ich meine try/catch-Anweisung im Hauptverfahren, das nicht funktioniert:

#MAIN 

try { 

$userName = Read-Host -Prompt "Input the user's username" 
$getUser = get_user 

    if ($userName -eq $getUser) 
     { 
      $courseId = Read-Host -Prompt "Input the course's ID" 
      $availability = Read-Host -Prompt "Available? (Yes/No)" 
      $courseRoleId = Read-Host -Prompt "Course Role? (Student/Instructor)" 

      $confirmationEnrollment = putStudentCourse 
      " " 
      "####################################################" 
      "Success!" 
      "####################################################" 
     }  
    else 
     { 
      $firstName = Read-Host -Prompt "First Name" 
      $lastName = Read-Host -Prompt "Last Name" 
      $netId = $userName 
      $email = $userName + "@school.edu" 
      $password = Read-Host -Prompt "Password" 
      $uin = Read-Host -Prompt "ID Number" 
      $isAvailable = Read-Host -Prompt "Available? (Yes/No)" 

      $confirmationUserCreate = user_create 
      " " 
      "####################################################" 
      "User created!" 
      "####################################################" 
      " " 
      $courseId = Read-Host -Prompt "Input the course's ID" 

      $confirmEnroll = putStudentCourse 
      " " 
      "####################################################" 
      "User enrolled!" 
      "####################################################" 
     } 
    } 
catch [System.Net.HttpWebRequest] 
    { 
     "####################################################" 
     "User not found. We'll create it now!" 
     "####################################################" 
     " " 
    } 

Im Moment ist es wirft Fehler, nachdem Sie einen Benutzernamen ein, der nicht existiert:

Invoke-RestMethod : The remote server returned an error: (404) Not Found. 
At E:\Blackboard_REST_API_Project\PowerShell\Post_Student_Course.ps1:42 char:13 
+  $getUser = Invoke-RestMethod -Method Get -Uri $url2 -ContentType $contentType2 ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException 
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand 

ich bin versucht, Verstecke den roten Fehler und gib aus, was ich in der catch-Anweisung habe, aber er überspringt den catch und springt direkt zum else, wenn er keinen Benutzernamen finden kann. Irgendwelche Ideen?

+0

Hallo emanresu. Das fängt den Fehler ab und gibt aus, was in der Catch-Anweisung steht, großartig! Das einzige Problem ist, dass es das Programm beendet und es nicht in die else-Anweisung geht. – SPedraza

+0

Sie fangen wahrscheinlich den falschen Ausnahmetyp. Außerdem glaube ich nicht, dass dieser Code tun wird, was Sie wollen. Wenn get_user einen Fehler auslöst, überspringen Sie den Codeabschnitt, der den Text "user created" enthält. Wollen Sie den Benutzer erstellen, wenn ein Fehler auftritt? – emanresu

+0

Korrekt. Wenn der Benutzer gefunden wird, fahren Sie mit der if-Anweisung fort (fragen Sie nach einer Kurs-ID und es wird den Benutzer registrieren, ich habe eine andere Funktion dafür). Wenn dies nicht der Fall ist, wechseln Sie zur else-Anweisung und erstellen Sie den Benutzer. – SPedraza

Antwort

0

In Bezug auf den Versuch Catch ist die wahrscheinlichste Ursache, dass ein anderer Fehler als der explizit nach dem Catch aufgeführten Fehler auftritt. Um dies zu testen, entfernen Sie den genannten Ausnahmetyp und fangen nur alle Fehler auf. Ich empfehle nicht, dies im Produktionscode zu tun, aber zum Testen wird es zumindest zeigen, ob Ihre allgemeine Idee richtig ist. Dann können Sie klären, welche spezifischen Fehler zu fangen sind.

Es scheint einige Verwirrung über die gewünschten Aktionen zu geben. Basierend auf den Kommentaren unterhalb der Frage und basierend auf Ihren Code-Kommentaren scheinen Sie zu sagen, dass der Benutzer nicht existiert und erstellt werden sollte, wenn die Anfrage einen Fehler auslöst. Wenn dies korrekt ist, seien Sie vorsichtig, da diese Annahme nicht immer zutrifft.

Sobald der Fehler ausgelöst wird, werden Sie tatsächlich den gesamten Code in Ihrer If Else-Struktur überspringen. Im Wesentlichen denke ich, dass Sie die Logik in Ihrer ELSE-Anweisung übernehmen und diese in den Catch-Block verschieben möchten. Wenn Sie versuchen möchten, den Benutzer entweder zu erstellen, wenn get_user einen Fehler auslöst oder wenn es keinen Fehler auslöst, aber die If-Bedingung fehlschlägt, wird die gleiche Logik in else AND im Catch verwendet. Natürlich wäre es besser, eine Funktion zu erstellen, die von einem beliebigen Code aus aufgerufen wird, anstatt Code zu duplizieren.

Im Wesentlichen:

Try{ 
    #try to invoke the request 

    #if the request did not fail then compare the user entered text to the text returned from the request 
    #if these match then user already exists 
    #else the user does not exist so create it here 
} 
catch{ 
    #if the request failed assume that the user does not exist and create it here 

} 
+0

Danke emanresu.Es war ein Syntaxproblem. Ich habe den Fehlertyp aus der catch-Anweisung gelöscht und die else in die catch-Anweisung verschoben. – SPedraza

2

Sie sind für den falschen Ausnahme-Typen in Ihrem catch -Aussage überprüfen. Ein 404 Fehler wird als WebException geworfen:

$Error[0] 
Invoke-RestMethod : The remote server returned an error: (404) Not Found. 
At line:2 char:5 
+  Invoke-RestMethod -Uri "http://www.vg.no/nonexistingpage" 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException 
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand 

$Error[0].Exception 

The remote server returned an error: (404) Not Found. 

$Error[0].Exception.GetType().FullName 

System.Net.WebException 

Versuchen:

try { 
    Invoke-RestMethod -Uri "http://www.vg.no/nonexistingpage" 
} 
catch [System.Net.WebException] 
{ 
    "Exception caught!" 
} 

Was das Skript, würde ich wahrscheinlich wie dies etwas tun, um den Benutzer zu machen erstellen, wenn dies nicht der Fall (404- Fehler):

#MAIN 

$userName = Read-Host -Prompt "Input the user's username" 

try { 
    $getUser = get_user 
} catch [System.Net.WebException] { 
    #User doesn't exist, create new 
    $firstName = Read-Host -Prompt "First Name" 
    $lastName = Read-Host -Prompt "Last Name" 
    $netId = $userName 
    $email = $userName + "@school.edu" 
    $password = Read-Host -Prompt "Password" 
    $uin = Read-Host -Prompt "ID Number" 
    #Is it required to create user? If not, remove as it's specified later 
    $isAvailable = Read-Host -Prompt "Available? (Yes/No)" 

    $confirmationUserCreate = user_create 
    " " 
    "####################################################" 
    "User created!" 
    "####################################################" 

    #Verify user was created 
    $getUser = get_user 
} 

#Not sure if test is still needed.. 
if($userName -eq $getUser) { 
    $courseId = Read-Host -Prompt "Input the course's ID" 
    $availability = Read-Host -Prompt "Available? (Yes/No)" 
    $courseRoleId = Read-Host -Prompt "Course Role? (Student/Instructor)" 

    $confirmationEnrollment = putStudentCourse 
    " " 
    "####################################################" 
    "Success!" 
    "####################################################" 
} 

Tipp: Sie sollten Parameter in Ihren Funktionen verwenden und sich nicht auf eventuell vorhandene Variablen verlassen.

+1

Gute Idee mit einem Ausschnitt, der zeigt, wie man den Namen des Ausnahmetyps bekommt. – emanresu