{"id":936645,"date":"2026-11-13T13:59:26","date_gmt":"2026-11-13T13:59:26","guid":{"rendered":"https:\/\/www.ninjaone.com\/blog\/powershell-error-handling\/"},"modified":"2026-11-13T13:59:27","modified_gmt":"2026-11-13T13:59:27","slug":"powershell-error-handling","status":"publish","type":"post","link":"https:\/\/www.ninjaone.com\/nl\/blog\/powershell-error-handling\/","title":{"rendered":"De complete gids voor PowerShell error handling"},"content":{"rendered":"<p>PowerShell is de belangrijkste command line- en scripttaal van Windows-besturingssystemen. U kunt er programma\u2019s mee uitvoeren en systeembeheertaken vanuit de terminal afhandelen. Systeembeheerders en ontwikkelaars gebruiken PowerShell dan ook volop om hun workflows te automatiseren.<\/p>\n<p>Error handling is een belangrijk onderdeel van elke vorm van <a href=\"https:\/\/www.ninjaone.com\/blog\/how-to-automate-tasks-with-powershell\/\">scripting en automatisering<\/a>. Als er iets misgaat, zouden uw PowerShell-scripts niet zomaar moeten crashen. Ze zouden moeten vaststellen dat er een fout is opgetreden en actie moeten ondernemen: de taak opnieuw proberen of u waarschuwen dat er iets mis is, zodat u de oorzaak kunt opsporen en verhelpen.<\/p>\n<p>Deze gids geeft u een gedetailleerd beeld van <strong>PowerShell error handling<\/strong>, inclusief soorten fouten, technieken voor error handling, voorbeelden van hoe u error handling in uw scripts implementeert en beste praktijken voor het throwen, catchen, loggen en afhandelen van fouten.<\/p>\n<p>Wilt u een snel overzicht? Bekijk dan deze videogids over <a href=\"https:\/\/www.ninjaone.com\/videos\/powershell\/complete-powershell-error-handling-guide\/\">de complete gids voor PowerShell error handling<\/a>.<\/p>\n<div style=\"padding: 56.25% 0 0 0; position: relative;\"><iframe data-mce-fragment=\"1\" frameborder=\"0\" height=\"350\" src=\"\/\/player.vimeo.com\/video\/1084269502?title=0&amp;byline=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" title=\"De complete gids voor PowerShell error handling\" width=\"425\"><\/iframe><\/div>\n<p><script src=\"https:\/\/player.vimeo.com\/api\/player.js\"><\/script><\/p>\n\n<h2>De soorten fouten in PowerShell<\/h2>\n<p>Er zijn twee soorten fouten die u verschillend moet afhandelen om uw PowerShell-scripts betrouwbaar te houden.<\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/terminating-errors?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">Terminating errors<\/a> stoppen de uitvoering van uw opdracht of script zodra ze optreden. Dit zijn meestal <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/learn\/deep-dives\/everything-about-exceptions?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">exceptions<\/a> en u kunt ze afhandelen met try\/catch-blokken (verderop in dit artikel toegelicht). Terminating errors ontstaan onder meer door syntaxfouten (wanneer u een opdracht verkeerd typt of ongeldige parameters meegeeft) en door interne fouten in de applicatie of opdracht die u uitvoert.<\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/non-terminating-errors?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">Non-terminating errors<\/a> stoppen de uitvoering van uw opdracht of script niet: uw PowerShell-script loopt gewoon door nadat de fout is opgetreden. Meestal verschijnt er bij een non-terminating error een foutmelding voordat de uitvoering wordt hervat. U moet deze fouten anders afhandelen dan terminating errors, zodat ze uw scripts niet laten vastlopen wanneer de verwachte uitvoer later alsnog nodig is. Non-terminating errors kunnen ontstaan door time-outs in het netwerk, ontbrekende bestanden of rechtenproblemen. Dat zijn op zichzelf geen kritieke exceptions of uitvoeringsfouten, maar ze leiden wel tot onbedoeld gedrag als u ze niet afhandelt.<\/p>\n<h2>Basisbegrippen van PowerShell error handling (try, catch, finally en $ErrorActionPreference)<\/h2>\n<p>Terminating errors en exceptions worden <em>gethrowd<\/em> (de fout treedt op) en <em>gecatcht<\/em> (er wordt code uitgevoerd om de fout af te handelen). Fouten die <em>niet<\/em> worden gecatcht, zorgen ervoor dat de uitvoering van uw PowerShell-script stopt. Door uw code in <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_try_catch_finally?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">try-, catch- en finally<\/a>-blokken te plaatsen, kunt u dit soort fouten beheersen.<\/p>\n<p>Als code in een <strong>try<\/strong>-blok een fout throwt, wordt het codeblok in het bijbehorende <strong>catch<\/strong>-blok uitgevoerd om de fout af te handelen (waarna de uitvoering kan doorgaan als dat gepast is). Opruimtaken die u hoe dan ook wilt uitvoeren of er nu een fout optrad of niet, zet u in een <strong>finally<\/strong>-blok. Verderop op deze pagina ziet u dit in een volledig codevoorbeeld.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/scripting\/understanding-non-terminating-errors-in-powershell\/\" rel=\"noopener\" target=\"_blank\">Non-terminating errors afhandelen<\/a> gaat anders, omdat er geen fout wordt gethrowd die de uitvoering stopt en u de fout dus ook niet kunt catchen. In plaats daarvan wordt de fout opgeslagen in de variabele <strong>$Error<\/strong>, een array met fouten die u op elk punt in uw PowerShell-scripts kunt raadplegen om te zien of een voorgaande instructie een non-terminating error heeft gegenereerd, zoals in dit voorbeeld:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\"\n\nif ($Error) {\n\nWrite-Host \"Error occurred: $($Error[0])\" # Display the most recent error as a string\n\n$Error.Clear() # Clear the error\n\n}<\/pre>\n<p>Hierboven genereert de PowerShell-opdracht <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.management\/get-childitem?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">Get-ChildItem<\/a> een non-terminating error als het opgegeven bestandssysteempad niet bestaat (in dit geval <strong>C:fake_path<\/strong>). De fout wordt vastgelegd in de variabele $Error, die vervolgens wordt gecontroleerd en afgehandeld.<\/p>\n<p>Wilt u de foutuitvoer van een specifieke opdracht aan een eigen variabele toewijzen, dan gebruikt u de parameter <strong>-ErrorVariable<\/strong> (let op: in dat geval is de foutvariabele geen array):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\" -ErrorVariable customError\n\nif ($customError) {\n\nWrite-Host \"Error occurred: $customError\" # Display the error as a string\n\n}<\/pre>\n<p>U kunt non-terminating errors ook omzetten in terminating errors en ze met try\/catch-blokken afhandelen. Dat doet u voor elke non-terminating error in uw script door de globale variabele <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.core\/about\/about_preference_variables?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\"><strong>$ErrorActionPreference<\/strong><\/a> op <strong>Stop<\/strong> te zetten:<\/p>\n<p><code>$ErrorActionPreference = \"Stop\"<\/code><\/p>\n<p>Wilt u dit alleen voor de fouten van \u00e9\u00e9n enkele opdracht, dan stelt u de parameter <strong>-ErrorAction<\/strong> in:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">Get-ChildItem -Path \"C:fake_path\" -ErrorAction Stop<\/pre>\n<h2>Try\/catch\/finally-blokken implementeren in PowerShell<\/h2>\n<p>Hieronder ziet u een voorbeeldscript in PowerShell dat de syntax en structuur van try\/catch\/finally-blokken laat zien. Het toont hoe u meerdere catch-blokken voor verschillende soorten exceptions gebruikt en hoe u met een finally-blok opruimt en eventueel resterende fouten afhandelt. Eerst een enkele fout die met een try\/catch-blok wordt afgehandeld:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n# Attempt a file operation that fails\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop\n\n} catch {\n\nWrite-Host \"Exception caught: $($_.Exception.Message)\"\n\n}<\/pre>\n<p>U kunt ook meerdere verschillende soorten mogelijke fouten in \u00e9\u00e9n <strong>try<\/strong>-blok afhandelen, elk met een eigen <strong>catch<\/strong>-blok:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n# Each of the below commands will throw a terminating error of a different type\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop # Attempt a file operation that fails to throw a ItemNotFoundException\n\n$null.fakeFunction() # Attempt to run a non-existent method on a null object to throw a RuntimeException\n\n$divideZero = 1\/0 # Divide by zero to throw an exception that won't be specifically caught\n\n} catch [System.Management.Automation.ItemNotFoundException] { # Catch the specific error thrown by Get-Content\n\nWrite-Host \"Item not found exception caught: $($_.Exception.Message)\"\n\n} catch [System.Management.Automation.RuntimeException] { # Catch the specific error thrown by $null.fakeFunction\n\nWrite-Host \"Runtime exception caught: $($_.Exception.Message)\"\n\n} catch { # Catch all other errors\n\n# General catch block for any other exceptions\n\nWrite-Host \"General exception caught: $($_.Exception.Message)\"\n\n} finally { # The finally block is always executed whether an exception was thrown or not.\n\nWrite-Host \"Executing the finally block.\"\n\n$Error.Clear() # This could, for example, be used to clean up non-terminating errors.\n\n}<\/pre>\n<p>In de code wordt het doel van elke instructie toegelicht, zodat u de volledige context ziet van hoe <strong>try<\/strong>, <strong>catch<\/strong> en <strong>finally<\/strong> samenwerken. Let op: als er meerdere terminating errors in hetzelfde <strong>try<\/strong>-blok optreden, wordt alleen de eerste fout gecatcht en afgehandeld, waarna het <strong>finally<\/strong>-blok wordt uitgevoerd. Zodra die fout is verholpen, worden volgende fouten gecatcht bij de volgende uitvoering van het script.<\/p>\n<h2>Geavanceerde technieken en voorbeelden voor error handling<\/h2>\n<p>U kunt try\/catch-blokken ook nesten, zodat fouten erdoorheen omhoog \u2018bubbelen\u2019. Zo handelt u specifieke fouten af in de binnenste try\/catch-blokken en vangt u in de buitenste blokken alle fouten op die niet zijn gecatcht of opnieuw zijn gethrowd, ook fouten uit uw binnenste <strong>catch<\/strong>-blokken. U kunt bijvoorbeeld geneste blokken gebruiken om specifieke fouten af te handelen en vervolgens \u00e9\u00e9n buitenste blok om alle fouten te catchen en te loggen, in plaats van de logcode in elk binnenste catch-blok te herhalen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try { # Beginning of the outer catch block\n\ntry { # Beginning of the inner catch block\n\n# Include potentially error-causing code here\n\nGet-Content -Path \"C:fake_pathfake_file.txt\" -ErrorAction Stop\n\n} catch [System.Management.Automation.ItemNotFoundException] { # Catch statement for the inner catch block that specifically handles ItemNotFoundException\n\nWrite-Host \"Inner try block file not found exception caught: $($_.Exception.Message)\"\n\n} catch { # Catch statement for the inner catch block that handles all other exceptions\n\nWrite-Host \"Inner try block exception caught: $($_.Exception.Message)\"\n\nthrow # Re-throw the exception so that it will bubble up to the outer try\/catch block\n\n}\n\n} catch { # Catch statement for the outer catch block\n\nWrite-Host \"Outer try block exception caught: $($_.Exception.Message)\" # Handle all errors re-thrown in the inner catch blocks here for clean up, logging, and alerting tasks\n\n}<\/pre>\n<p>Merk in bovenstaand voorbeeld op dat de <strong>ItemNotFoundException<\/strong> niet opnieuw wordt gethrowd en dus niet omhoog bubbelt naar het buitenste catch-blok.<\/p>\n<p>Naarmate u uw PowerShell-scripts uitbreidt voor uw eigen toepassingen, wilt u waarschijnlijk ook eigen exceptions en PowerShell-<a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/windows-powershell-error-records?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">foutrecords<\/a> kunnen introduceren:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">try {\n\n$customException = New-Object Exception \"This is a custom error!\" # Create and throw a custom error\n\n# Create a custom Error Record\n\n$customErrorRecord = New-Object System.Management.Automation.ErrorRecord (\n\n$customException,\n\n\"CustomErrorID\",\n\n[System.Management.Automation.ErrorCategory]::NotSpecified, # Sets the ErrorRecord category to NotSpecified\n\n$null # Specify no specific target object for this error\n\n)\n\nthrow $customErrorRecord\n\n} catch {\n\n# Catch and handle the custom error record\n\nWrite-Host \"Error Message: $($_.Exception.Message)\"\n\nWrite-Host \"Error ID: $($_.FullyQualifiedErrorId)\"\n\n}<\/pre>\n<p>Hierboven ziet u dat er geen doelobject is opgegeven (het staat op <strong>$null<\/strong>). U kunt dit vervangen door een bestandspad of een andere verwijzing en extra details aan de tekst van de exception toevoegen om de eigen fout informatiever te maken.<\/p>\n\n<h2>Beste praktijken voor PowerShell error handling<\/h2>\n<p>Er zijn verschillende beste praktijken die u bij het schrijven van uw PowerShell-scripts kunt volgen om error handling effectief te maken:<\/p>\n<ul>\n<li><strong>Schrijf duidelijke en voorspelbare foutmeldingen<\/strong>: uw foutmeldingen moeten beschrijvend zijn en voldoende details uit de Exception of het <a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/scripting\/developer\/cmdlet\/interpreting-errorrecord-objects?view=powershell-7.4\" rel=\"noopener\" target=\"_blank\">ErrorRecord-object<\/a> bevatten om de specifieke oorzaak van een fout te achterhalen.<\/li>\n<li><strong>Zorg dat uw scripts kunnen doorlopen (of netjes afsluiten) wanneer er een fout optreedt<\/strong>: als uw scripts nog andere taken uitvoeren, wilt u de fout misschien afhandelen terwijl die taken doorlopen. Fouten die verdere uitvoering onmogelijk maken, moeten uw script laten afsluiten met een <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/windows-powershell-exit-codes\/\" rel=\"noopener\" target=\"_blank\">exitcode<\/a>. Log en rapporteer vervolgens het resultaat van alle fouten.<\/li>\n<li><strong>Test uw infrastructuur voor error handling en rapportage regelmatig<\/strong>: uw PowerShell-automatiseringen zijn waardeloos als ze falen zonder dat u het doorhebt. Test uw scripts regelmatig door bewust fouten te introduceren, zodat u zeker weet dat uw error handling werkt, de details worden gelogd en u een melding krijgt.<\/li>\n<\/ul>\n<p>Error handling is een belangrijke functie van PowerShell-scripting en helpt u terwijl u uw script- en automatiseringsvaardigheden ontwikkelt. Door error handling goed te implementeren, fouten correct te throwen, try\/catch\/finally-blokken te gebruiken en $ErrorActionPreference in te zetten, leert u <a href=\"https:\/\/www.ninjaone.com\/blog\/windows-powershell-commands-cheat-sheet\/\">de PowerShell-syntax<\/a> beter kennen. Bovendien krijgt u meer inzicht in de problemen die uw scripts tegenkomen en kunt u ze beter beheren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PowerShell is de belangrijkste command line- en scripttaal van Windows-besturingssystemen. U kunt er programma\u2019s mee uitvoeren en systeembeheertaken vanuit de terminal afhandelen. Systeembeheerders en ontwikkelaars gebruiken PowerShell dan ook volop om hun workflows te automatiseren. Error handling is een belangrijk onderdeel van elke vorm van scripting en automatisering. Als er iets misgaat, zouden uw PowerShell-scripts [&hellip;]<\/p>\n","protected":false},"author":35,"featured_media":269612,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[4358],"tags":[],"class_list":["post-936645","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-ops-nl"],"acf":[],"modified_by":null,"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/posts\/936645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/comments?post=936645"}],"version-history":[{"count":1,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/posts\/936645\/revisions"}],"predecessor-version":[{"id":936646,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/posts\/936645\/revisions\/936646"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/media\/269612"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/media?parent=936645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/categories?post=936645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ninjaone.com\/nl\/wp-json\/wp\/v2\/tags?post=936645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}