我一直在决定如何在我的应用程序中处理异常.
如果我的异常问题来自1)通过远程服务访问数据或2)反序列化JSON对象.不幸的是,我不能保证这些任务中的任何一个都成功(切断网络连接,不正确的JSON对象,这是我无法控制的).
因此,如果我遇到异常,我只需在函数内捕获它并返回FALSE给调用者.我的逻辑是,所有调用者真正关心的是任务是否成功,而不是为什么它不成功.
这是典型方法的一些示例代码(在JAVA中)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我认为这种方法很好,但我真的很想知道管理异常的最佳实践是什么(我应该在调用堆栈中一直冒出异常吗?).
总结关键问题:
跟进/编辑
感谢所有反馈,在网上找到了一些关于异常管理的优秀来源:
似乎异常管理是根据上下文而变化的事情之一.但最重要的是,人们应该如何管理系统中的异常.
另外注意通过过多的尝试/捕获代码腐烂或不给予例外它的尊重(例外是警告系统,还需要警告什么?).
此外,这是m3rLinEz的一个很好的选择评论.
我倾向于同意Anders Hejlsberg和你的看法,大多数来电者只关心操作是否成功.
从这个评论中,它提出了一些在处理异常时要考虑的问题:
假设您正在foo()A类中编写方法.foo不会访问任何A的状态.你对foo的作用或行为方式一无所知.它可以做任何事情.
无论其他任何考虑因素,foo应该始终是静态的吗?为什么不?
似乎我的类总是在积累许多私有帮助器方法,因为我将任务分解并应用了only-write-it-once原则.其中大多数不依赖于对象的状态,但在类自己的方法之外永远不会有用.它们默认是静态的吗?结束大量内部静态方法是错误的吗?
是否有一个"最佳实践",可以在try/catch块中放入多少代码?
我在下面发布了3种不同的场景.
我没有在每个catch块中包含行为,我没有包含finally块.这是为了提高观众的可读性.假设每个人都catch做了不同的事情.并假设finally将关闭流.试着为未来的读者创建一个易于阅读的例子.
try/catch.try/catch为每个需要的地方1 .try/catch周围的整个代码块.什么被普遍认为是最佳实践,为什么?
场景1
代码没有try/catch,只是为了控制.
BufferedReader bufferedReader = new BufferedReader(new FileReader("somepath"));
String line;
while ((line = bufferedReader.readLine()) != null) {
Object object = new Object();
this.doSomething(object);
}
bufferedReader.close();
Run Code Online (Sandbox Code Playgroud)
情景2
代码,try/catch每个地方都需要一个块.
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader("somepath"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String line;
try {
while ((line = bufferedReader.readLine()) != …Run Code Online (Sandbox Code Playgroud) 关于使用try/的最佳实践,我有一个非常基本的问题catch.我有一个像这样的简单函数(DAO)
public void addVehicle(Vehicle vehicle) {
em.getTransaction().begin();
em.persist(vehicle);
em.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)
并在Web服务中使用DAO功能:
@WebMethod(operationName = "addVehicle")
public void addVehicle(Vehicle vehicle) {
try {
vehicleDAO.addVehicle(vehicle);
System.out.print("Vehicle added");
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
或者更好地使用try/ catch内部DAO函数,如下所示:
public void addVehicle(Vehicle vehicle) {
try {
em.getTransaction().begin();
em.persist(vehicle);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 我现在和过去已经深入阅读和讨论了以下问题和文章:
我将使本文成为组织中异常处理的编码标准!非常好但没有回答我:http: //www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET
Java或C#中的异常管理的最佳实践在 这里:我不喜欢这个声明:(你不应该试图捕捉每个可能的地方的每一个例外.
我有一个问题,当我需要决定用try-catch语句包含一些代码块时,我知道应该包含代码是错误的代码,我必须检查我可以检查的内容,但是例如:我需要在一些文本文件中写一行,我应该检查文件是否存在,如果我有权写入它,我应该检查磁盘上是否有空间,或者磁盘是否可写,如果我检查了如果我在编写文件时发生了什么事情(其他一些应用程序或线程使用了空间,或者可移动驱动器已被删除?),如果我检查了这些内容并处理了IOException和SecurityException以及其他可能的异常,这是最佳实践吗? ,或者我应该只检查没有try-catch?
另一个例子:我正在使用EntityFramework来访问数据库,当访问某些内容时可能会联系数据库,我知道我应该检查连接是否关闭并尝试打开它,但是有很多很多东西可能会导致这个语句失败,数据库可能位于可移动驱动器上,此驱动器可能在读取时被删除,DBMS的服务可能因任何原因停止,不会抛出空间异常,数据库的方案可能会在我尝试执行某些代码后发生变化****原因,我如何防止我的代码失败,我可以检查我可以检查的每件事,然后继续吗?或者我应该使用try catch作为例外我可以期待,即使我已经检查了它们?
请给我你的答案参考,而不是一般的答案!
编辑
请务必阅读:http: //msdn.microsoft.com/en-us/library/seyhszts.aspx
好吧,我一直在环顾四周,做了很多谷歌搜索,但我仍然找不到避免这种警告的方法.
Integer result = chooser.showOpenDialog(null);
if (result.equals(0))
{
String tempHolder = chooser.getSelectedFile().getPath();
filenameLoad = new File(tempHolder);
filenameSave = filenameLoad;
FileInputStream fis = null;
ObjectInputStream in = null;
try
{
fis = new FileInputStream(filenameLoad);
in = new ObjectInputStream(fis);;
}
catch(IOException ex)
{
ex.printStackTrace();
}
try
{
loadFile = (ArrayList<Dot>)in.readObject();
}
catch(IOException ex)
{
System.out.println("Cast fail");
}
catch(ClassNotFoundException ex)
{
System.out.println("Cast fail");
}
catch (ClassCastException ex)
{
System.out.println("Cast fail");
}
try
{
in.close();
}
catch(Exception ex)
{
System.out.println("failed to close in");
} …Run Code Online (Sandbox Code Playgroud)