2016-03-05 66 views
2

在Powershell中,它好像总是会执行Finally块。如果Catch块 已被执行,是否有办法告诉Powershell在Finally块中不执行语句。示例我的下面的代码,如果电子邮件已被触发,那么我不希望powershell生成日志文件。Powershell - 错误处理(如果Catch块已被调用,不要调用finally块)

Catch 
{ 
$ErrorMessage = $_.Exception.Message 
$FailedItem = $_.Exception.ItemName 
Send-MailMessage -From xxxxxxxxxx 
Break 
} 

Finally 
{ 
$Time=(Get-Date).ToString('MM/dd/yyyy hh:mm:ss tt') 
"This script made a read attempt at" + "$d1" | out-file $logfile -append 
} 
+3

这与“终于”的概念是相反的。这听起来像你的finally块中应该在你的try块的最后。 –

回答

2

我不认可使用此代码,但回答你的问题,是的,有可能做这样的事情。

$badIdea = $true 

try 
{ 
    Write-Output "About to do something dumb." 
    $ugh = 1/0; 
    Write-Output "Did I do something dumb?" 
} 
catch 
{ 
    Write-Output "Caught something dumb." 
    $badIdea = $false 
} 
finally 
{ 
    if ($badIdea -eq $true) 
    { 
     Write-Output "Performing finally..." 
    } 
    else 
    { 
     Write-Output "Skipping finally..." 
    } 
} 

代码做你告诉它......并且你可以在你想要的任何地方使用条件语句。

这将产生:

About to do something dumb. 
Caught something dumb. 
Skipping finally... 
+0

感谢您的评论。现在我知道如何重写我的代码。谢谢 – user664481

+0

@ user664481:我建议专注于“我不认可使用此代码”部分的答案 - Kory的方法仅适用于_unusual_场景。 – mklement0

2

Finally条款的目的是为了总是执行,异常 是否发生

因此,Jason Boyd指出了关于这个问题的评论,您通常会放置代码,你只希望如果的try语句之后发生没有例外执行。

breakCatch处理器保证下try语句中的任何代码只达到的情况下,没有发生例外 - 但注意break简单地爆发任何封闭循环的 - 甚至跨越功能和脚本边界(! );仅在没有封闭循环时才是break等同于退出封闭脚本。

+1

我同意。也就是说,可以有一个合理的理由在finally中添加一些条件代码。不知道确切的情况,很难说,但当然,这似乎反对终于......继续... –

+1

@KoryGill:的确,我们不知道确切的情况,但是,基于方式这个问题是措辞,我怀疑缺乏对基本面的理解。 – mklement0

相关问题