我有一些功能与数据库一起使用。 我在这里设置了一个try / catch用于错误处理,并显示一条消息,它工作正常。
现在调用此删除函数的类需要知道是否存在错误。在我的情况下:如果成功则刷新GUI,如果失败则无需执行任务(因为已经显示消息消息对话框)。
我想出了一个在这个函数中返回布尔值的想法。
public static Boolean delete(int id){
String id2 = Integer.toString(id);
try {
String sql =
"DELETE FROM toDoItem " +
"WHERE id = ?;";
String[] values = {id2};
SQLiteConnection.start();
SQLiteConnection.updateWithPara(sql, values);
} catch (SQLException e) {
Main.getGui().alert("Fail when doing delete in DataBase.");
System.out.println("Exception : "+ e.getMessage());
return false;
}
return true;
}
不知道这是好还是坏,请告诉你。
编辑:
以下是有关如何使用的详细信息:
让我们说上面的代码在A类中, 在B班:
public boolean deleteItem(int id){
int i = index.get(id);
if(theList[i].delete()){ //<---- here is the function from Class A
theList[i] = null;
index.remove(id);
retutn true;
}
retutn false;
}
我需要在多个课程中传递布尔值,我不知道这是否可以更好地通过......
C类中的:
public void toDoList_deleteItem(){
MyButton btn = (MyButton)source;
int id = btn.getRefId();
List toDoList = Main.getToDoList();
if(toDoList.deleteItem(id)){ //<-------function in Class B
Main.getGui().refresh();
}
}
编辑2:
我注意到这个问题在某种程度上更有可能要求&#34;我应该在数据库层处理哪一个影响GUI层的异常?&#34; ......就是这样。如果问题标题应该编辑,请纠正我。
答案 0 :(得分:9)
看起来您正在返回boolean
状态,表示发生了异常情况。一般来说,这不是一个好习惯,原因有两个:
更好的方法是定义特定于应用程序的异常,并在API中使用它。这会强制API的用户注意可能发生的异常情况,同时允许您根据需要传递尽可能多的(或尽可能少的)其他信息。同时,您的代码不会因每个API调用上的if (!delete(id)) { /* handle error */ }
代码而受到污染,缩小代码库并提高其可读性。
您能告诉我更多关于“定义特定于应用程序的异常”的信息,或者显示一些代码示例吗?
我将如何做到这一点:
public class DataAccessException extends Exception {
... // Define getters/setters for passing more info about the problem
}
...
public static void delete(int id) throws DataAccessException {
try {
... // Do something that may lead to SQLException
} catch (SQLException se) {
// Do additional logging etc., then
throw new DataAccessException("Error deleting "+id, se);
}
}
注意:通常会给自定义异常提供四个构造函数,这些构造函数镜像Exception
类的构造函数以允许异常链接。构造函数描述为here。
答案 1 :(得分:4)
请勿返回Boolean
,并返回boolean
。由于这不是异常/错误条件,因此没问题。
答案 2 :(得分:3)
只要您不希望调用者知道发生了什么,只是它失败了(并且失败是其预期行为的一部分),您应该没问题。
话虽如此,我注意到这一点:Main.getGui().alert("Fail when doing delete in DataBase.");
。
您似乎正在从其他地方访问GUI层。如果您决定多线程化应用程序,这可能会导致问题。此外,通常认为使图层不相交是一种好习惯。
答案 3 :(得分:1)
如果您不期望失败,则应使用例外。
在你的情况下,如果抛出SQLException并且不影响你的程序对你来说没问题,那么可以返回一个布尔值。
如果导致删除失败的SQLExcetion会导致应用程序的另一部分出现问题,最好抛出异常。
编辑:
根据您的编辑,似乎您在发生错误时正在进行一些维护和清理。在这种情况下,我建议使用Exceptions比使用布尔值来控制执行更好。
答案 4 :(得分:1)
这个问题主要基于意见。就个人而言,我不希望在那时抓住异常。
根据caller
的{{1}}应该做什么,您可能需要其他结果。因此,您最好添加一个throw语句,让调用方法决定错误是否至关重要 - 或者是否可以继续。
仅delete()
和true
没有必要让调用者正确决定。他不知道由于数据库错误,由于外键限制或其他原因导致删除失败。
让异常冒泡调用堆栈将为调用者提供正确的错误,增加以正确方式处理错误的机会,或者只显示自定义错误消息,帮助用户采取适当的操作。< / p>