Mathematica 具有CheckAbort
功能,可以捕获和处理用户生成的和程序化的Abort
。但它不允许捕获由TimeConstrained
和MemoryConstrained
等函数生成的中断:
TimeConstrained[CheckAbort[Pause[100], Print["From CheckAbort"]], 1]
(不打印"From CheckAbort"
)。
有没有办法在 Mathematica 中捕获此类中断?
编辑:我知道TimeConstrained
和MemoryConstrained
的第三个参数允许在中断的情况下评估一些代码,但这种方式不是我需要的:I需要一种方法来完全处理我的函数中的这些中断,允许用户不关心它的内部。
P.S。我需要这个的原因是我有一个创建MathLink
对象的函数,在任何中断或中止的情况下必须关闭,但在其他情况下则不能。
答案 0 :(得分:11)
此构造以未记录的形式提供。
Internal`WithLocalSettings[
preprocessing,
code,
postprocessing]
将导致在从中止或各种类型的跳转返回之前进行后处理。
另见:
Reliable clean-up in Mathematica
Import big files/arrays with mathematica
Daniel Lichtblau
答案 1 :(得分:3)
这是WReach解决方案的改进版本(他在对Daniel Lichtblau的回答中提出了建议)。我应该重新定义我的函数f
,如下所示(现在将其称为ff
):
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] /; (Unset[done]; True) :=
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]; Unset[done]]]
示例:
ff[1 + 1]
(*=>f[2]*)
TimeConstrained[ff[Pause[10]; 1 + 1], 1]
(*=> prints "Interrupt!"*)
TimeConstrained[ff[Pause[.10]; 1 + 1], 1]
(*=>f[2]*)
答案 2 :(得分:1)
TimeConstrained[Pause[100], 1, Print["-->Aborted"]]
和
MemoryConstrained[100!, 1, Print["-->Aborted"]]