我有一个函数可以处理其路径由用户给出的图像。我对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'存在。 –