java能否处理由MS SQL Server RAISEERROR命令引起的异常?

java能否处理由MS SQL Server RAISEERROR命令引起的异常?,java,sql-server-2008,exception-handling,raiserror,Java,Sql Server 2008,Exception Handling,Raiserror,不幸的是,我被迫使用java在MS SQL Server中执行一些存储过程。发生异常时,我正在SPs中使用RAISEERROR命令。问题是java似乎无法捕获这些异常。 我的样本SP: ALTER PROCEDURE [dbo].[sp_test] @fname nchar(30), @lname nchar(30) AS BEGIN BEGIN TRY IF (@fname) = 'something' BEGIN

不幸的是,我被迫使用java在MS SQL Server中执行一些存储过程。发生异常时,我正在SPs中使用RAISEERROR命令。问题是java似乎无法捕获这些异常。 我的样本SP:

ALTER PROCEDURE [dbo].[sp_test] 
    @fname nchar(30),
    @lname nchar(30)
AS
BEGIN

    BEGIN TRY
        IF (@fname) = 'something'
        BEGIN
            RAISERROR (N'First name is not valid!',16,1, N'number', 5);
            RETURN
        END
        Insert into [users] (
            [id]
          ,[fname]
          ,[lname]
          )
       Values
        (
            '1',
            @fname,
            @lname
        )
    END TRY
    BEGIN CATCH

    END CATCH   
END
我的Java代码:

try {
                // Establish the connection.
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                    con = DriverManager.getConnection(connectionUrl);
                    //------- Call a sp
                    String SPsql="EXEC sp_test ?,?"; //String SPsql="EXEC <sp_test> ?,?";
                    PreparedStatement ps=con.prepareStatement(SPsql);
                    ps.setEscapeProcessing(true);
                    ps.setQueryTimeout(20);
                    ps.setString(1, "something");
                    ps.setString(2, "12346");
                    //ps.setString(parameterIndex, x)
                   ps.execute();

                    }
            }
        catch (SQLException e) {
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
SP正常执行,但java中未捕获任何异常

那么,java能处理这类异常吗?我在这里做错什么了吗?

语句错误。。由于nchar固定长度字符串,未执行。把它改成nvarchar

语句RAISERROR。。由于nchar固定长度字符串,未执行。把它改成nvarchar


对不起,伙计们,我的错,我忘了在SP中填充捕捉部分,因此将RAISEERROR放在那里解决了我的问题:

.
.
.
    BEGIN CATCH
        RAISERROR (N'ERROR OCCURED!!! %s %d.', 16, 1, N'number', 5); 
    END CATCH   

对不起,伙计们,我的错,我忘了在SP中填充捕捉部分,因此将RAISEERROR放在那里解决了我的问题:

.
.
.
    BEGIN CATCH
        RAISERROR (N'ERROR OCCURED!!! %s %d.', 16, 1, N'number', 5); 
    END CATCH   

谢谢你的回复,但问题不是这样的。不管怎样,你说的很有用。谢谢你的回复,但问题并不是这样。不管怎样,你所说的很有用。你正在接受T-SQL代码中的异常。从一开始就重新提高。。。END CATCH block您正在接受T-SQL代码中的异常。从一开始就重新提高。。。端挡块