如何在不将JAX-WS Web服务转发到客户端的情况下捕获它们的异常

时间:2013-05-30 12:21:29

标签: java jax-ws

我正在研究Java Web服务(SOAP),并且我使用了异常处理。某些操作可能会抛出IOExceptions。尽管我使用try-catch语句处理它们,但它们仍然会被发送回客户端。如何在不将Exception发送回客户端的情况下继续执行服务?

例如,我有以下代码

synchronized public int parseDataModelFromDatabase(Connection con, Logger webAppLog) {
    FileWriter fStream;
    BufferedWriter out;
    Connection dbCon;
    Statement st;
    this.data_model = null;
    File f = new File(this.OUTPUT_DIR + "/" + this.data_model_file);
    if(f.exists()) {
        f.delete();
    }
    try {
        f.createNewFile();
    }catch(IOException e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): Failed to create output file: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase() threw an IOException when attempted to create new data file: ", e);
        return -1;
    }
    if(!f.exists()) {
        return -2;
    }
    try {
        fStream = new FileWriter(this.OUTPUT_DIR + "/" + this.data_model_file);
        out = new BufferedWriter(fStream);
    }catch(Exception e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): Failed to open output file: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): Failed to open output data file: ", e);
        return -3;
    }

    String selectStr = "SELECT * FROM " + this.dbTableUserPrefs;
    try {
        dbCon = (Connection) con;
        if(dbCon != null && dbCon.isValid(0) == true) {
            st = (Statement) dbCon.createStatement();
            ResultSet rs = st.executeQuery(selectStr);
            while(rs.next()) {
                out.write(rs.getString(1) + "," + rs.getString(2) + "," +
                        rs.getString(3) + "," + rs.getString(4) + "\n");
            }
            out.close();
            dbCon.close();
        }
    }catch(SQLException e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): SQL Exception occured: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): SQLException thrown on writing to the data model file.", e);
        return -7;
    }catch(IOException e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): IO Exception occured: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): IOException thrown on writing to the data model file.", e);
        return -8;
    }
    try {
        if(f != null && f.isFile() == true && f.exists() == true)
            this.data_model = new FileDataModel(f);
    }catch(FileNotFoundException e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): FileNotFoundException message: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): FileNotFoundException thrown on parsing the data model file.", e);
        return -5;
    }catch(IOException e) {
        System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): IOException message: "
                + e.getMessage());
        webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): IOException thrown on parsing the data model file.", e);
        return -6;
    }
    return 0;
}

此函数由以下函数调用,该函数是Web服务API的一部分:

public int ReloadRecommendationModel(@WebParam(name = "username") String uname, @WebParam(name = "password") String pass) {
    System.out.println("EngineModule.ReloadRecommendationModel called.");
    if(uname.equals(this.cap_recommender_uname) == false || pass.equals(this.cap_recommender_pass) == false) {
        return -1;
    }
    DataSource ds_preferences = null;
    DataSource ds_similarities = null;
    Connection con_preferences;
    Connection con_similarities;
    try {
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        ds_preferences = (DataSource) envContext.lookup("jdbc/user_history");
        ds_similarities = (DataSource) envContext.lookup("jdbc/similarity_model");
    }catch(NamingException e) {
        System.err.println(e.getMessage());
        webAppLog.error("EngineModule.ReloadRecommendationModel(): Error occured while obtaining context.", e);
    }
    int val = 0;
    try {
        if(ds_preferences != null && ds_similarities != null) {
            con_preferences = (Connection) ds_preferences.getConnection();
            con_similarities = (Connection) ds_similarities.getConnection();
            synchronized(SingletonItemSimilarityModel.getModel()) {
                val = (SingletonItemSimilarityModel.getModel()).parseDataModelFromDatabase(con_preferences, webAppLog);
                if(val != 0) {
                    webAppLog.error("EngineModule.ReloadRecommendationModel(): parseDataModelFromDatabase() returned: " + val + ".");
                    return 0;
                }
                val = (SingletonItemSimilarityModel.getModel()).parseSimilarityModelFromDatabase(con_similarities, webAppLog);
                if(val != 0) {
                    webAppLog.error("EngineModule.ReloadRecommendationModel(): parseSimilarityModelFromDatabase() returned: " + val + ".");
                    return 0;
                }
            }
        }
        webAppLog.info("EngineModule.ReloadRecommendationModel(): Reload operation of data-model completed with return code: " + val + ".");
    }catch(SQLException e) {
        System.err.println("EngineModule.ReloadRecommendationModel(): Error occured while attempting to connect to Recommender data-source: " +
                 e.getMessage());
        webAppLog.error("EngineModule.ReloadRecommendationModel(): Error occured while attempting to connect to Recommender data-source.", e);
    }
    return val;
}

可能抛出异常的部分如下:

try {
    if(f != null && f.isFile() == true && f.exists() == true)
        this.data_model = new FileDataModel(f);
}catch(FileNotFoundException e) {
    System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): FileNotFoundException message: "
            + e.getMessage());
    webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): FileNotFoundException thrown on parsing the data model file.", e);
    return -5;
}catch(IOException e) {
    System.err.println("ItemSimilarityModel.parseDataModelFromDatabase(): IOException message: "
            + e.getMessage());
    webAppLog.error("ItemSimilarityModel.parseDataModelFromDatabase(): IOException thrown on parsing the data model file.", e);
    return -6;
}

如何确保执行不会停止并且客户端看不到异常?

谢谢你, 尼克

1 个答案:

答案 0 :(得分:0)

考虑将代码包装在try-catch(Throwable e)中。这应该抓住一切。