2

我有一個函數可以處理其路徑由用戶給出的圖像。我對Mathematica有點新鮮,對於它的大量文檔我找不到太多東西。導入[myFile]失敗時如何拋出異常?我可以這樣做嗎?在數學中找不到文件時拋出異常

非常感謝。

+1

我建議在導入之前不要忘記檢查文件是否由'FileExistsQ'存在。 –

回答

2

您可以使用Throw[anyExpression]Throw[anyExpression, exceptionTag]以任何表達式引發異常。然後您可以使用Catch[your code]Catch[yourCode,exceptionPattern]。 Mathematica中的例外不是像在例如Java,因此您不能直接使用構建異常繼承層次結構的技術,並使用多個catch語句來從更具體到更通用的捕獲。需要使用異常標記來爲異常提供一個標識,這與Java中的異常類名稱有些類似。沒有第二個參數的Throw會拋出一個無標記的異常,可以在沒有第二個參數的情況下被Catch捕獲。如果你真的想在Mathematica中使用異常,我會反對這樣的用法,因爲你可以很容易地捕捉到你不打算捕捉的東西 - 就像你通常不會在Java中使用Exception一樣,而是將其子類化。 Mathematica中沒有檢查異常,因此所有Mathematica異常都可以被視爲運行時異常。由於Catch的第二個參數是一個模式,因此您可以構建Catch命令,以便能夠使用不同標記捕獲異常,從而在某種程度上模擬Java的異常繼承層次結構。語法也不同 - 沒有try - 您只需將Catch包裝在您可能預期會發生異常的一段代碼周圍。請注意,沒有第二個參數的Catch不會捕獲標記的異常,而具有第二個參數的Catch不會捕獲未標記的異常。如果你同時需要,你可能需要像Catch [Catch [code,pattern]]一樣嵌套。沒有finally子句作爲內置提供,但可以用用戶定義的代碼模擬它,因爲在Mathematica中,還可以使用非縮進評估(帶有保持屬性的函數等)來編程控制流結構, 。您可以在文檔中找到用例CatchThrow,在SO帖子的這裏以及MathGroup上,您會發現很多很好的例子。

HTH

+3

我非常贊同使用兩個參數的表單,並帶有可識別的標籤(例如,不是「失敗」)以避免與其他代碼發生衝突。標籤不一定是簡單的對象;你可以使用像Catch [扔[1 + 1,MyApp'exception [「foo」]],_MyApp'exception]。 –

+1

@Brett好點!在同一個函數同時拋出和捕獲異常的情況下,我發現下面的技巧很有用 - 在函數的周圍包裝一個'Module',就像這樣:'Module [{exc},f [x_,y _]:= Catch [If [x> 0 || y <0,拋出[something,exc],x + y],exc]]'。通過這種方式,異常標記保證是唯一的,我們不必考慮它,再加上我們不會引入一個我們應該關心的符號(我們確實創建了符號)。一個這樣的例子非常有用:http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/bc41b4a5f51fbcb8 –

4

一個簡單的原型是

Catch[ 
    Check[img = Import["myFile"], Throw[$Failed], Import::nffil]; 
    Print["Processing image"] 
] 

在這裏您可以通過使用tag■如果需要的話使CatchThrow更有針對性。

相關問題