判断球拍程序是否在沙箱中

Determin if a racket program is in a sandbox

是否可以确定 Racket 程序是否正在 运行 沙箱中?

我问的原因是因为我有一个创建文件的 Racket 宏。并且 DrRacket 后台扩展器会阻止创建文件(应该如此)。但是,这样做会导致 window 底部出现错误,提示无法创建文件。

所以,我想确定我是否在沙箱中,如果是,请不要创建文件,并请完成宏。

一般来说,您无法确定自己是否处于沙盒中。但是,您确实有机会捕获在尝试执行受限操作时抛出的错误。但是,要注意的是您不知道将抛出什么类型的错误。因此,您可以做的一件事就是抓住所有这些。使用 with-handlers to catch the error and exn:fail? 捕获所有错误。

(with-handlers ([exn:fail?
                 (lambda (x) (displayln "failing cleanly"))])
    (make-temporary-file))

这里要小心,这里可能会出现与沙箱无关的错误。例如,您可能会因为无法创建文件而收到错误消息:

(with-handlers ([exn:fail:filesystem?
                 (lambda (x) (displayln "Coudln't open file"))]
                [exn:fail?
                 (lambda (x) (displayln "failing gracefully"))])
  (make-temporary-file))