2016-01-29 5 views
1

Можно ли определить, запущена ли программа Racket в песочнице?Определить, находится ли программа ракетки в песочнице

Причина, по которой я спрашиваю, заключается в том, что у меня есть макрос Racket, который создает файл. И расширитель фона DrRacket предотвращает создание файла (как он должен). Однако при этом в нижней части окна появляется ошибка, указывающая, что файл не может быть создан.

Итак, я хотел бы определить, есть ли я в песочнице, и если да, не создавайте файл и любезно заканчивайте макрос.

+0

ли это на самом деле важно различать создание файла не в состоянии из-за работу в песочнице, в отличие от неудачи по другим причинам? Если нет, вы можете поймать 'exn: fail: filesystem' (я предполагаю), используя' with-handlers'. В противном случае, хотя вы можете вызвать 'current-security-guard', значение AFAIK полностью непрозрачно. –

+0

Yup, насколько я могу сказать, 'current-security-guard' довольно непрозрачен. И хотя вы можете использовать новый, вам нужно дать ему родительский, так что вы не можете найти, какую ошибку будет выбросить. –

ответ

0

В общем, вы не можете определить, находитесь ли вы в песочнице. Однако у вас есть шанс поймать ошибки, которые возникают при попытке выполнить ограниченную операцию. Однако выгода заключается в том, что вы не знаете, какой тип ошибки будет выброшен. Так что одна вещь, которую вы можете сделать, это просто поймать всех. Используйте with-handlers, чтобы поймать ошибку и 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))