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更有针对性。

相关问题