如何捕获TimeConstrained生成的中断?

时间:2011-09-28 16:51:01

标签: wolfram-mathematica

Mathematica 具有CheckAbort功能,可以捕获和处理用户生成的和程序化的Abort。但它不允许捕获由TimeConstrainedMemoryConstrained等函数生成的中断:

TimeConstrained[CheckAbort[Pause[100], Print["From CheckAbort"]], 1]

(不打印"From CheckAbort")。

有没有办法在 Mathematica 中捕获此类中断?

编辑:我知道TimeConstrainedMemoryConstrained的第三个参数允许在中断的情况下评估一些代码,但这种方式不是我需要的:I需要一种方法来完全处理我的函数中的这些中断,允许用户不关心它的内部。

P.S。我需要这个的原因是我有一个创建MathLink对象的函数,在任何中断或中止的情况下必须关闭,但在其他情况下则不能。

3 个答案:

答案 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"]]