在mathematica中找不到文件时抛出异常

时间:2011-02-27 19:07:56

标签: exception wolfram-mathematica filenotfoundexception throw

我有一个处理路径由用户提供的图像的函数。我对Mathematica有点新鲜,而且我的大文档也找不到多少。如何在Import [myFile]失败时抛出异常?我甚至可以这样做吗?

非常感谢。

2 个答案:

答案 0 :(得分:4)

一个简单的原型是

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

如果需要,您可以使用Catch更有针对性地Throwtag

答案 1 :(得分: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中,也可以使用非strandard评估编程控制流构造(具有Hold的函数) - 属性等)。您可以在文档中查找CatchThrow的用例,在SO帖子和MathGroup上查找,你会发现很多很好的例子。

HTH