我有一個函數可以處理其路徑由用戶給出的圖像。我對Mathematica有點新鮮,對於它的大量文檔我找不到太多東西。導入[myFile]失敗時如何拋出異常?我可以這樣做嗎?在數學中找不到文件時拋出異常
非常感謝。
我有一個函數可以處理其路徑由用戶給出的圖像。我對Mathematica有點新鮮,對於它的大量文檔我找不到太多東西。導入[myFile]失敗時如何拋出異常?我可以這樣做嗎?在數學中找不到文件時拋出異常
非常感謝。
您可以使用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中,還可以使用非縮進評估(帶有保持屬性的函數等)來編程控制流結構, 。您可以在文檔中找到用例Catch
和Throw
,在SO帖子的這裏以及MathGroup上,您會發現很多很好的例子。
HTH
我非常贊同使用兩個參數的表單,並帶有可識別的標籤(例如,不是「失敗」)以避免與其他代碼發生衝突。標籤不一定是簡單的對象;你可以使用像Catch [扔[1 + 1,MyApp'exception [「foo」]],_MyApp'exception]。 –
@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 –
一個簡單的原型是
Catch[
Check[img = Import["myFile"], Throw[$Failed], Import::nffil];
Print["Processing image"]
]
在這裏您可以通過使用tag
■如果需要的話使Catch
和Throw
更有針對性。
我建議在導入之前不要忘記檢查文件是否由'FileExistsQ'存在。 –