簡體   English   中英

如何在不將異常轉發給客戶端的情況下在JAX-WS Web服務上捕獲異常

[英]How to catch Exceptions on a JAX-WS web service without forwarding them to the client

我正在使用Java Web服務(SOAP),並且使用了異常處理。 某些操作可能會引發IOException。 盡管我使用try-catch語句來處理它們,但它們仍然被發送回客戶端。 如何在不將異常發送回客戶端的情況下繼續執行服務?

例如我有以下代碼

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 Service 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;
}

如何確保執行不會停止並且從客戶端看不到異常?

謝謝尼克

考慮將代碼包裝在try-catch(Throwable e) 這應該抓住一切。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM