是否可以在不使用try catch块的情况下将抛出的异常写入文件?
例如
public static void method() throws Exception, SQLException{
if(Exception is thrown){
write Exception to out.txt;
write SQLException to out.txt;
}
}
或者您必须这样做:
public static void method(){
try{
...
}catch(Exception ex){
write ex to file;
}catch(SQLException sqlex){
write sqlex to file;
}
}
答案 0 :(得分:1)
在Java中,我不会认为它是可能的。
但是,如果在* nix上执行,则只能redirect all output to a file(或只是错误输出)。但这不是一般的解决方案。
答案 1 :(得分:1)
你必须catch
那个例外。如果你抓住它,后来决定写一个文件就可以了。鉴于你有上面的内容,我建议采用第二种方式,因为if语句无法实际获得异常。
答案 2 :(得分:1)
捕获方法中特定错误的唯一方法是使用Try / Catch块。但是,有一个类可以捕获所有未捕获的异常 - 即任何没有Try / Catch的异常。
您可以编写自定义类来实现Java的UncaughtExceptionHandler
接口。
import java.lang.Thread.UncaughtExceptionHandler;
public class CustomUncaughtExceptionHandler implements UncaughtExceptionHandler {
public void uncaughtException(Thread thread, Throwable throwable) {
/* Write to file here */
}
}
然后,您需要告诉Java虚拟机将未捕获的异常重定向到您的类。
public static void main(String[] args){
Thread.setDefaultUncaughtExceptionHandler(new CustomUncaughtExceptionHandler());
}
答案 3 :(得分:1)
除非你检测字节代码(你可以使用代理和asm之类的东西),否则你无法使用直接java。您可以使用方面执行此操作,这比字节代码检测方法更容易。以aspectj为例。一个方面可能是:
public aspect ExceptionAdvice {
pointcut allMethods() : execution(* *(..)) && !within(com.test.ExceptionAdvice);
after() throwing(Exception e) : allMethods() {
//write to a file or whatever - I'm lazy and just printed the stack
e.printStackTrace ();
}
}
将此编织到应用程序类后,抛出的所有异常都将通过此处的连接点传递。我只是打印堆栈,但您可以将其记录到文件或做任何你想做的事情。当连接点完成时,将继续抛出异常,因此调用代码有机会处理它。显然,您需要更改切入点定义以适合您的类,但这是一般的想法。
答案 4 :(得分:0)
没有
public static void method() throws Exception, SQLException{
if(Exception is thrown){
write Exception to out.txt;
write SQLException to out.txt;
}
}
异常来自哪里?
顺便说一句:你永远不会声明要抛出最抽象的异常Exception
。一些RuntimeExceptions几乎可以在任何地方出现(Nullpointer,OutOfMemory),所以在任何地方声明它们都没用。这只是噪音。
public static void method() throws Exception, SQLException{
try{
...
}catch(Exception ex){
write ex to file;
}catch(SQLException sqlex){
write sqlex to file;
}
}
但是如果你抓住它,你通常不会抛出,因此根本不会声明抛出异常。
答案 5 :(得分:0)
在第二个块中,您已经捕获了异常,因此不需要抛出异常,SqlException。
在常规代码行上检测到异常,因此您无法为每个代码添加if。是的,try / catch(写)是唯一的方法。
除非......你使用if / else而不是异常处理
答案 6 :(得分:0)
您需要捕获异常并重新抛出它。
public static void method() throws Exception, SQLException{
try{
...
}
catch(SQLException sqlex){
write sqlex to file;
throw ex;
}
catch(Exception ex){
write ex to file;
throw ex;
}
}