Wolfram mathematica 如何捕获由时间约束生成的中断?

Wolfram mathematica 如何捕获由时间约束生成的中断?,wolfram-mathematica,Wolfram Mathematica,Mathematica具有CheckAbort功能,允许捕获和处理用户生成的和编程的Aborts。但它不允许捕捉由TimeConstrained和MemoryConstrained等函数生成的中断: TimeConstrained[CheckAbort[Pause[100], Print["From CheckAbort"]], 1] (不从CheckAbort打印“) 在Mathematica中有没有办法捕捉到这样的中断 EDIT:我知道TimeConstrained和MemoryConst

Mathematica具有
CheckAbort
功能,允许捕获和处理用户生成的和编程的
Abort
s。但它不允许捕捉由
TimeConstrained
MemoryConstrained
等函数生成的中断:

TimeConstrained[CheckAbort[Pause[100], Print["From CheckAbort"]], 1]
(不从CheckAbort打印

在Mathematica中有没有办法捕捉到这样的中断

EDIT:我知道
TimeConstrained
MemoryConstrained
的第三个参数允许在中断的情况下计算一些代码,但这种方法不是我需要的:我需要一种完全在我的函数内部处理此类中断的方法,允许用户不关心其内部

另外,我之所以需要它,是因为我有一个函数,可以创建
MathLink
对象,在任何中断或中止的情况下必须关闭这些对象,但在其他情况下不能关闭

TimeConstrained[Pause[100], 1, Print["-->Aborted"]]


此构造以未记录的形式提供

Internal`WithLocalSettings[
  preprocessing,
  code,
  postprocessing]
将导致在从中止或各种类型的跳转返回之前进行后处理

另见:


Daniel Lichtblau

这里是花环解决方案的改进版本(他在对Daniel Lichtblau回答的评论中提出)。我应该重新定义我的函数
f
,如下所示(现在称之为
ff
):

示例:

ff[1 + 1]
(*=>f[2]*)
TimeConstrained[ff[Pause[10]; 1 + 1], 1]
(*=> prints "Interrupt!"*)
TimeConstrained[ff[Pause[.10]; 1 + 1], 1]
(*=>f[2]*)

我的意思是一种完全在我的函数内部捕获中止的方法,允许用户不必关闭我的
MathLink
连接。@Alexey
outerFunc[x]:=timeconstrated[innerFunc[x],10,Print[…]
。。。谢天谢地……我不需要在函数内部设置时间约束。我只是希望允许用户使用它而不会有遇到问题的风险。@Alexey你能举一个你预期使用的例子吗?我的意思是,如果
f[expr]
作为我的
MathLink
函数,在从内核中计算
expr
,我希望允许用户编写
timeconstrated[f[expr],10]
,而不考虑
f
的内部(不使用第三个参数).
Internal`WithLocalSettings
在任何情况下都会计算
后处理
,而不仅仅是在中断发生时。在对我的函数进行任何评估之后,我不需要关闭
MathLink
连接-只有在某些中断或中止发生时才需要关闭连接。如果引入“完成”标志,这可能会起作用,例如
timeconstrated[Module[{done=False},Internal`WithLocalSettings[Print@“start”,Pause[100];done=True,if[!done,Print@“Interrupted!”],5]
@好主意!但是您的解决方案没有保留
timeconstrated
的语义,该语义返回满足时间约束的函数的输出。我还希望避免对我函数的输出进行双重评估。@Leonid我觉得您的第一次编辑非常接近解决方案,但找不到钥匙圈给出的答案。我将发布改进版的花环解决方案作为一个单独的答案。@Alexey好的,花环的代码要简单得多。我尝试过类似的事情,但不知何故错过了这种可能性。我会留下我的答案一段时间,然后将其删除。根据花环的建议,将答案作为一个单独的答案张贴出来,这听起来也是一个好主意。
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]*)