2013-06-27 62 views
1

我無法在此搜索一個明確的答案。例如,throw 'temper tantrum'Write-Error 'temper tantrum' -ErrorAction Stop之間是否有任何實際差異?「throw」關鍵字和「Write-Error-ErrorAction Stop」之間有什麼區別?

它們都會產生終止錯誤並設置$?假。我可以看到在CategoryInfo和FullyQualifiedErrorId中存在差異。操作詞是實際。他們有不同的效果嗎?在特定的情況下,是否有理由相對於另一個?

+0

可能重複[什麼時候應該使用Write-Error vs Throw?](http://stackoverflow.com/questions/9294949/when-should-i-use-write-error-vs-throw) –

+0

不可以,不是重複的。我的問題更具體。 ** Write-Error **和** throw **之間的主要區別在於** throw **生成終止錯誤,而** Write-Error **默認情況下不生成。我已經意識到這一點。我的問題是,如果使用「-ErrorAction Stop」使寫入錯誤生成終止錯誤,那麼功能是否存在任何差異。我現在看到(由於Ansgar答案中的提示)他們用不同的對象類型填充$ error。我想知道的是兩者之間是否存在任何優點,缺點,警告或不同用法。 –

回答

5

throw生成終止錯誤,Write-Error沒有-ErrorAction Stop會生成非終止錯誤。由於-ErrorAction Stop將非終止變爲終止錯誤,因此兩條指令基本相同。

雖然有差異。 throw <expression>填充$error[0].TargetObject<expression>,而Write-Error <expression> -ErrorAction Stop不填充。

+0

這確實指向我的方向,儘管它似乎相當混亂。我發現實際上$ error的填充方式有很多不同,顯然是因爲** throw **會將ErrorRecord對象移到$ error數組上,而** Write-Error -ErrorAction Stop **會取消移動ActionPreferenceStopException目的。奇怪的是,當** Write-Error **創建一個*非終止錯誤時,它將ErrorRecord對象添加到$ error。所以,回到我對「實踐」一詞的強調:在哪種情況下,哪一種更適合或者有不同的行爲? –

+0

事實上,從我在MSDN上讀到的內容來看,顯然**技術上由** Write-Error -ErrorAction Stop **生成的錯誤甚至不是終止錯誤,儘管它會終止腳本(http:// msdn。 microsoft.com/en-us/library/system.management.automation.errorrecord%28v=vs.85%29.aspx,http://msdn.microsoft.com/en-us/library/system.management.automation。 actionpreferencestopexception%28V = vs.85%29.aspx)。仍然想知道是否有任何實際的差異使用,因爲這一點。 –

+3

這將遠沒有人第一次在PowerShell中找到多種不同的方法來做同樣的事情。 :-)使用'throw'是表達終止錯誤的規範方法,'Write-Error'是表達非終止錯誤的標準方式(doh表示1000個文件中有一個正在使用 - 我會注意到一個非終止錯誤,終止錯誤,但繼續處理其他999)。實際上,所有cmdlet都實現無處不在的參數-ErrorAction,這個角落案例(Write-Error -ea Stop)存在。 –

相關問題