Wolfram mathematica 如何设置全局中止处理程序?

Wolfram mathematica 如何设置全局中止处理程序?,wolfram-mathematica,Wolfram Mathematica,在回答这个问题时,我建议OP在笔记本的开头打开一个流,然后在最后关闭它。但是,如果生成了中止,则流将保持打开状态,如果他们不先检查就试图再次打开流,则会造成严重破坏。如果只需要一个函数就可以使用流,那么这个过程将非常简单,但整个笔记本都需要它。显然,可以添加一个检查来查看流是否已经打开,但是是否有一种方法可以连接到全局Abort处理程序,以便全局处理此类问题 编辑:具体地说,我正在寻找一种方法,在发生中止时运行任意代码,无论代码当前是否在内部运行。基本上,如果可能的话,我想设置一个全局中止处理程

在回答这个问题时,我建议OP在笔记本的开头打开一个流,然后在最后关闭它。但是,如果生成了
中止
,则流将保持打开状态,如果他们不先检查就试图再次打开流,则会造成严重破坏。如果只需要一个函数就可以使用流,那么这个过程将非常简单,但整个笔记本都需要它。显然,可以添加一个检查来查看流是否已经打开,但是是否有一种方法可以连接到全局
Abort
处理程序,以便全局处理此类问题


编辑:具体地说,我正在寻找一种方法,在发生
中止
时运行任意代码,无论代码当前是否在内部运行。基本上,如果可能的话,我想设置一个全局
中止
处理程序。如果这在笔记本级别存在,那么更好。

一个非常简单的方法是在文件开头发布以下内容:

Close /@ Streams[] // Quiet
标准流
stdout
stderr
无法关闭,您可以使用
Quiet
使警告静音。然而,这也假设您没有任何关心的开放流

要处理
中止
并关闭流,您可以修改
$Post
如下:

$Post := If[# === $Aborted, Close[strm], #] &

其中,
strm
是您打开的流。

作为替代方案,如果您希望将效果本地化到单个笔记本,您可以按照以下方式执行操作:

SetOptions[EvaluationNotebook[], 
   CellEvaluationFunction -> 
     (ToExpression[#, StandardForm,
         Function[
            Null,
            Module[{aborted = $Aborted},
              Internal`WithLocalSettings[
                 Null,
                 aborted = (ReleaseHold[Most[Hold[##]]];Last[Hold[##]]),
                 AbortProtect[
                   If[aborted === $Aborted,
                      Print["Did cleanup"]; Abort[]
                   ]]]], 
            HoldAll]] &)
]
注:重写以纳入@Alexey的建议

注2修改为在单个单元格中容纳多个输入。在这种情况下,除最后一个输出外,所有输出均被抑制


在这里,您可以将
Print[“Did cleanup”]
代码替换为您拥有的任何清理代码

正确,并回答了具体问题。但是,当发生
中止时,是否有运行任意全局代码的通用方法?也可用于在
CheckAbort
中包装函数调用。由于我对您的答案进行了投票,我并没有帮助自己超过您的总数。我认为包装
Print[“Did cleanup”];在
AbortProtect
中中止[]
。此外,
CheckAbort
不允许捕捉中断。通过这种方式,使用
Internal`WithLocalSettings
而不是
CheckAbort
@yoda是合理的,我只选择Leonid的答案,因为它可以包含在一个笔记本中。@Leonid重新启动Mathematica后,问题消失了。但是试着在单元格中的不同行中输入两个表达式-只打印第一个。@Alexey好的,这是一个很好的捕获。部分解决方案是使用
(表示[#,标准格式,函数[Null,打印[Hold[##]],HoldAll]&)
,但这将导致不同的输出,因为所有输入行将被组合以产生单个输出,作为单个输出的
序列。我现在不知道如何补救。但我至少会修改答案,因为目前只执行第一个输入。@Alexey确实如此。我不会太担心一个特性没有文档化,主要的问题是它是否已经在内部被频繁使用,以保证它在将来的版本中仍然存在。唉,我现在没有时间深入研究这个问题,但如果你发现了什么,我肯定会对你的结果感兴趣(可能还有其他人)。