Я играю с чужим кодом, изучая его в ответе.
Он продолжает вызывать System / exit, что приводит к отключению моего repl.Это приводит в бешенство.
Во всем коде, к которому у меня есть доступ, я высмеивал вызовы.
Но он также вызывает некоторый библиотечный код, к которому у меня нет источника, обаjava и clojure, и это иногда также вызывает выходы.
Есть ли способ перехватить эти вызовы глобально, чтобы попытка вызвать их не привела к потере потока repl?В идеале вместо этого просто выдается исключение.
Я думаю, что в java я мог бы установить новый SecurityManager, чтобы получить этот эффект, но я никогда этого не делал
, кажется, что-то в этом естьстрока здесь: http://jroller.com/ethdsy/entry/disabling_system_exit
Так что я думаю что-то вроде:
(System/setSecurityManager (SecurityManager.))
только мне как-то нужно прикрепить
public void checkPermission( Permission permission ) {
if( "exitVM".equals( permission.getName() ) ) {
throw new ExitTrappedException() ;
}
}
Мой лучший выстрел пока:
(System/setSecurityManager
(proxy [SecurityManager] []
(checkPermission [p]
(when (= "exitVM" (.getName p))
(throw (Exception. "exit"))))))
или, может быть,
(System/setSecurityManager
(proxy [SecurityManager] []
(checkExit [n] false)))
Но они оба просто уничтожают реплику
Или есть лучший способ сделать это?