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

在回答这个问题时,我建议OP在他的笔记本开头打开一个流,并在最后关闭它。 但是,如果生成Abort ,则流将保持打开状态,并且如果他们尝试再次打开而不先检查,则会造成严重破坏。 如果该流只用于单个功能,则该解决方案将很简单,但对于整个笔记本电脑来说是必需的。 显然,可以添加一个检查来查看该流是否已经打开,但是是否有办法绑定到全局Abort处理程序中,以便可以在全局范围内处理此类问题?

编辑 :是具体的,我正在寻找一种方式来运行任意代码时Abort是否发生,还是不行,代码正在内部运行CheckAbort 。 从本质上讲,如果可能的话,我想设置一个全局Abort处理程序。 如果这存在于笔记本电脑级别,那就更好了。


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

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"]代码。


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

Close /@ Streams[] // Quiet

标准流stdoutstderr无法关闭,您可以使用Quiet静默警告。 但是,这也假定您没有任何您关心的开放流。

要处理Abort并关闭流,可以修改$Post如下所示:

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

strm是您打开的流。

链接地址: http://www.djcxy.com/p/35609.html

上一篇: How do you set a global Abort handler?

下一篇: On the use of of Internal`Bag, and any official documentation?