WithCleanup

WithCleanup[expr,cleanup]

即使在 expr 计算期间生成了中止、抛出等命令,函数也会计算 expr,在返回结果之前运行 cleanup.

WithCleanup[init,expr,cleanup]

在计算 expr 之前计算 init,在 initcleanup 中禁用中止、抛出等.

更多信息

  • 下列运算类型在 WithCleanupinitcleanup 中以多种方式被禁用:
  • 中止Abort 和交互中止
    限制基于 TimeConstrainedMemoryConstrained 的终止
    控制传递Throw, Confirm, Goto, Break, Continue,
  • 若在 init 的计算期间有一个中止被初始化,则这个中止不会立即执行,即 expr 不会被计算,但 cleanup 仍会被计算.
  • 若在 expr 的计算期间有一个中止被初始化, 则计算被中止,但 cleanup 会被继续执行.
  • 若在 cleanup 的计算期间有一个中止被初始化,则该终止会延迟到 cleanup 的计算完成之后进行.
  • 通过构建在外部产生的限制,如 TimeConstrained[... WithCleanup[...]... ],在 WithCleanup 中的表现类似终止.
  • 如果目标在 WithCleanup[...] 之外的控制传递在 initexpr 内发生,则 initexpr 的计算会被中止,且 cleanup 被计算,然后传递发生.
  • 若在 cleanup 的计算期间发生控制传递,则其不会被延迟.

范例

打开所有单元关闭所有单元

基本范例  (2)

在返回结果前清除对 x 的赋值:

即使在计算的主表达式中有一个中止,该清除也会被完成:

对于其他类型的异常也一样:

范围  (2)

即使计算被中止,清除依然会被执行:

在主表达式计算期间,若外部限制已达到,则清除会被完成:

WithCleanup 内部的限制不会被特殊对待:

应用  (1)

即使在计算被中断的情况下,也保证工作文件正常关闭:

数据安全写入硬盘:

同样,无论计算如何结束,都保证临时文件会被删除:

文件被成功删除:

属性和关系  (3)

在初始化或清除的过程中生成的中止不会阻止计算完成:

在主表达式计算期间的生成的中止会使得计算立即中止:

在任何参数中的外部控制传递会立即结束该参数的计算:

注意,如果传递在更早前的参数就已经开始,则会发生清除命令的计算:

在最后一个参数中,控制传递立即生效:

初始化和清除都在 AbortProtect 中有效封装:

可能存在的问题  (1)

在初始化和清除的计算不能被交互中止或为其加上时间限制:

将所有非必要的代码移入主表达式:

Wolfram Research (2020),WithCleanup,Wolfram 语言函数,https://reference.wolfram.com/language/ref/WithCleanup.html.

文本

Wolfram Research (2020),WithCleanup,Wolfram 语言函数,https://reference.wolfram.com/language/ref/WithCleanup.html.

CMS

Wolfram 语言. 2020. "WithCleanup." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/WithCleanup.html.

APA

Wolfram 语言. (2020). WithCleanup. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/WithCleanup.html 年

BibTeX

@misc{reference.wolfram_2024_withcleanup, author="Wolfram Research", title="{WithCleanup}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/WithCleanup.html}", note=[Accessed: 22-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_withcleanup, organization={Wolfram Research}, title={WithCleanup}, year={2020}, url={https://reference.wolfram.com/language/ref/WithCleanup.html}, note=[Accessed: 22-November-2024 ]}