1

我一直在寻找这个问题的答案,但还没有找到。

基本上我正在尝试通过 GUI 连接到数据库服务器。我的老板希望能够输入所有字段,然后检查它们是否是有效条目,然后如果有任何无效条目,他希望我将文本变为红色,表示该字段无效。我有 try 语句 catch ClassNotFoundException 和 SQLException。因为需要检查多个字段,所以我尝试使用一组 if 语句来检查连接信息。这是下面的代码,我希望这有意义......

    //The cancel boolean values in this code are used elsewhere to regulate the Threads
    try 
    {
                   //attempt connection here
    } 
    catch(ClassNotFoundException | SQLException e)
    {
        String[] errors = new String[4]; //This will create a String array of the errors it catches
                                         //and will later get called into a method that displays
                                         //the messages in a JOptionPane.showMessageDialog()
        if (e.getMessage().startsWith("The TCP/IP connection to the host"))
        {
            errors[0] = "SQL CONNECTION FAILED: Please check the server URL you entered to make sure it is correct.";
            cancel = true;
            mGUI.serverNameTextField.setForeground(Color.RED);
        }

        if (e.getMessage().startsWith("Login failed for user"))
        {
            errors[1] = "LOGIN FAILED: You do not have sufficient access to the server.";
            cancel = true;

        }
        if (e.getMessage().startsWith("Cannot open database"))
        {
            errors[2] = "SQL CONNECTION FAILED: Please check the database name you entered to make sure it is correct.";
            cancel = true;
            mGUI.dbNameTextField.setForeground(Color.RED);
        }

        mGUI.reportErrors(errors); //Method where it reports the String[] array of errors
                                   //However, the 'errors' parameter only returns one error
                                   //message at a time, which is the problem.

谢谢你的帮助!

****编辑* ** * ** 我找到了一个解决方案,所以希望这会对某人有所帮助。我更改了我的 if 语句以添加一个 AND 参数来检查特定的错误代码。您可以通过设置断点并查看调试透视图找到错误代码,或者您可以按照我所做的并设置打印语句来查看错误代码。这是打印语句:

    System.out.println(((SQLException) e).getErrorCode());

这是我的新 for 语句:

    try 
    {
        //attempt connection here
    } 
    catch(SQLException | ClassNotFoundException e)
    {
        if (e instanceof SQLServerException && ((SQLServerException) e).getErrorCode() == 0)
        {
            //code here
        }
        else{
            //code here
        }
        System.out.println(((SQLException) e).getErrorCode()); //Here is the print statement to see the error code.
        if (e instanceof SQLServerException && ((SQLServerException) e).getErrorCode() == 4060)
        {
            //code here
        }else{
            //code here
        }
        if(cancel != true)
        {
            //code here
        }
    }
4

3 回答 3

0

你可以通过多种方式做到这一点

1 有多个具有共同功能的 catch

}catch (ClassNotFoundException e){
    handleError(e);

}catch (SQLException e){
    handleError(e);
}

其中handleError 将异常作为参数。

您似乎没有做任何其他事情,因此您可以将它们组合成一个例外

}catch(Exception e){

}

这将捕获所有内容,但您对错误处理的控制要少得多。

于 2013-07-01T21:53:16.613 回答
0

异常的一般原则是在最能处理它们的地方处理它们。

您似乎有非常不同的异常,并且可能在代码中某处抛出的 TCP 异常与连接到数据库时抛出的 SQLException 不同(我可能在这里错了,因为我不知道代码的其余部分是什么样的)。因此,一组异常处理程序不会更有意义,每种类型都有一个。还要从 Bryan Roach 重申,文本消歧不是一个好主意。

try {
...
} catch (java.net.SocketException e) {
 e[0] = "tcp error";
} catch (java.sql.SQLException e) {
 e[1] = "sql exception happened";
}

此外,您的字符串数组似乎有点风险,可能是

ArrayList errors = new ArrayList();
errors.add("Some tcp error");
errors.add("Some db error");

然后为你报错

mGUI.reportErrors(errors.toArray())

将保留您的界面,而不会浪费您必须为数组分配额外的元素并具有空条目。我不确切知道您的问题是什么,但您提到 GUI 没有显示多个错误。可能有一个检查在数组中的第一个空元素处停止。假设 e[2] 和 e[4] 已填充,它可能会在迭代错误时停止,因为 e[3] 为空。我再次假设,因为我不知道该代码是什么样的

于 2013-07-01T22:07:36.640 回答
0

从上面的评论看来,您想要做的是对您在单个 catch 块中捕获的各种异常类型有不同的逻辑。如果是这种情况,你可以去:

...
catch(ClassNotFoundException | SQLException e) {
    String[] errors = new String[4];
    if (e instanceof ClassNotFoundException) {
       //do something here
    }
    if (e instanceof SQLException) {
       //do something else here
    }
    ...etc
}

这应该可行,但使用多个 catch 块可能就像其他人建议的那样容易:

}catch (ClassNotFoundException e){
    handleError(e);
}catch (SQLException e){
    handleError(e);
}

我没有任何冒犯的意思,但代码处理异常的方式可能会导致一些令人头疼的问题。例如:

if (e.getMessage().startsWith("Cannot open database")) {

这里的代码依赖于抛出异常的支持库以使用相同的文本描述,但是如果您切换到另一个 JVM 版本、使用不同的数据库驱动程序等,此描述可能会发生变化。使用异常类型可能更安全,而不是异常描述。

于 2013-07-02T04:54:40.727 回答