通过在repl中检查它,我正在玩别人的代码.
它一直调用System/exit,这会导致我的repl.这令人气愤.
在我可以访问的所有代码中,我嘲笑了这些调用.
但它也调用了一些我没有源代码的库代码,包括java和clojure,这偶尔会导致退出.
有没有办法全局捕获这些调用,所以尝试调用它们不会杀死repl线程?理想情况下,它只会抛出异常.
我想在java中我可以安装一个新的SecurityManager来获得这个效果,但我从来没有这样做过
这里似乎有一些东西:http: //jroller.com/ethdsy/entry/disabling_system_exit
所以我想的是:
(System/setSecurityManager (SecurityManager.))
Run Code Online (Sandbox Code Playgroud)
只有我需要附加
public void checkPermission( Permission permission ) {
if( "exitVM".equals( permission.getName() ) ) {
throw new ExitTrappedException() ;
}
}
Run Code Online (Sandbox Code Playgroud)
我到目前为止最好的射门是:
(System/setSecurityManager
(proxy [SecurityManager] []
(checkPermission [p]
(when (= "exitVM" (.getName p))
(throw (Exception. "exit"))))))
Run Code Online (Sandbox Code Playgroud)
或者可能
(System/setSecurityManager
(proxy [SecurityManager] []
(checkExit [n] false)))
Run Code Online (Sandbox Code Playgroud)
但他们都只是破坏了这个代表
或者有更好的方法吗?