2014-01-05 65 views
0

我有以下方法:的Java:stderr和捕获的异常

public void doQuery(String q){ 
     try{ 
      java.sql.Statement statement.execute(q); 
     } catch (SQLException e){ 
      System.out.println("query: "+q); 
      e.printStackTrace(); 
     } 
    } 

我的上述意图是,因为偶尔在插入文本值有这将导致语句失败一个双引号,是赶上错误并继续。

我的问题是,这段代码会做我想要的吗?看来由于这个错误,程序正在终止 - 我在stderr中看到了一个堆栈跟踪,这是我没想到会看到的。

感谢,

杰夫

+0

你觉得'e.printStackTrace();'在做什么? – Henry

+0

你可以更换你的字符串q ...不是吗? –

+1

这不会编译'java.sql.Statement statement.execute(q);'不是一个有效的语句[:)] – 2014-01-05 09:18:26

回答

1

是的,你的代码会做你想要的,你抓住它的任何SQL异常,打印查询并打印堆栈跟踪的错误流。

如果您不想将其打印到错误流中,请删除该命令。

我建议你不要打印你的查询。这不是一个好的做法,因为潜在的恶意用户可能利用有关您的数据库的知识。

如果您的程序由于未处理的异常而意外终止,我认为您的excel不是SqlException类型。为了确保捕获所有异常,您可以定义其他捕获块以捕获更常见类型的异常。

你可以做这样的:

try 
    { 
     java.sql.Statement statement.execute(q); 
    } 
    catch (SQLException e){ 
     System.out.println("DB Exception"); // Put breakpoint here 
     e.printStackTrace(); 
    } 
    catch(Exception e) 
    { 
     System.out.println("General Exception"); // Put breakpoint here 
     e.printStackTrace(); 
    } 

如果你不能找到意外终止的原因,你应该尝试调试程序。你可以把断点放到突出显示的地方,看看哪一个被击中。否则,您可以尝试逐步调试以找出问题所在。

+0

感谢:两个问题: – Jeff

+0

谢谢。我曾认为堆栈跟踪将被打印到标准输出。我想你是在说,因为我正在捕捉Exceptionable,所以这不是程序终止的原因,但我认为没有其他理由说明它正在终止。我将尝试在catch块中捕获Exception而不是SQLException。 – Jeff

+0

通常最好处理特定类型的异常,而不是更通用的异常。 –