Wolfram mathematica 如何捕获由时间约束生成的中断?
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
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
连接。@AlexeyouterFunc[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]*)