Java中if语句中的异常处理



我是Java中自定义错误处理的新手,我正试图弄清楚如何使用catch语句在if语句中传递特定消息。我想多用一双眼睛看看我想做什么,并在我完全想得太多、做得太过火之前提供反馈。

考虑:我们有一个每小时日志文件的目录,我有一个按需报告作业,它将创建迄今为止创建的所有日志文件串联起来。我想添加一个步骤,检查是否存在连接的日志文件,删除它,然后创建它(如果存在),或者只创建它(不存在)。对于下面的代码,如果由于某种原因无法创建新文件,我将返回一个异常。

try {
File file = new File (destinationPath + "todayToNowLogFile.csv");
if(file.exists())
{
if(file.delete()) 
{
System.out.println(file.getName() + " is deleted!");
} else {
System.out.println("Existing file cannot be deleted.")
} 
} else {
System.out.println("File will be created.");
}
}
//
catch(Exception e) {
System.err.println("Exception: ");
System.out.println("Exception: "+ e.getMessage().getClass().getName());
e.printStackTrace();
}

现在,在无法删除文件的情况下,我想显示阻止文件删除的异常。首先,我需要catch这个错误,但我该把try放在哪里?

做这样的事情。。。

try 
{  
if(file.delete()) 
{
System.out.println(file.getName() + " is deleted!");
}
}
else {
catch(Exception eDel) {
System.err.println("Exception: ");
System.out.println("Exception: "+ eDel.getMessage().getClass().getName());
eDel.printStackTrace(); 
}
}

中断CCD_ 4块。我不知道如何在if...then中插入try...catch。有办法做到这一点吗?或者,我的原始代码是否捕捉到了与try块中定义的file上的ANY操作相关联的每个错误,并且我需要将if...then逻辑放入catch块中,类似于这个伪代码。。。。

catch(Exception e) {
if(exception relates to file deletion) {
"File delete exception " + exceptionMessages;
} else if(exception relates to file creation) {
"File create exception " + exceptionMessages;
} else if(other exception) {
"other exception " + exceptionMessage;
} else {
"no exceptions encountered"
}
}

处理这种情况最合适的方法是什么?

您应该将try/catch视为任何其他语句。所以你可以把它放在if/then/else语句的两个分支中的任何一个,但它必须是完整的:

if(statement){
...    
try{
...
}catch(...){
...
}
...
}else{
...    
try{
...
}catch(...){
...
}
...
}

如果你必须捕获多个异常,你可以通过多个捕获部分来实现:

try{
...
}catch(Exception1 e1){
...
}catch(Exception2 e2){
...
}catch(Exception3 e3){
...
}

您想要的是创建自己的Exception类。

要创建一个异常类,需要扩展exception类。下面是一个例子。假设我的自定义异常类应该命名为MyFileErrorException

所以我创建了一个像这样的新类-

class MyFileErrorException extends Exception {
private String message = null;
public MyFileErrorException() {
super();
}
public MyFileErrorException(String message) {
super(message);
this.message = message;
}
public MyFileErrorException(Throwable cause) {
super(cause);
}
@Override
public String toString() {
return message;
}
@Override
public String getMessage() {
return message;
}
}

现在我需要随意抛出这个异常。所以在你的情况下,你想捕捉文件删除异常,所以代码会像这样-

if(file.delete()) 
{
System.out.println(file.getName() + " is deleted!");
} else {
try{
System.out.println("Existing file cannot be deleted.")
throw new MyFileErrorException("File Could not be deleted val is null");
}catch(MyFileErrorException ex){
//Do wahtever you want to do
}
} 

首先,您应该检查是否有任何方法可以抛出任何特定的异常。您可以通过查看Javadoc或使用您喜欢的IDE来完成此操作。

如果您将Exception捕获为Exception类,它将捕获作为其子类的每个Exception

如果你想有特定的异常处理,例如,对于delete()方法中的IOException,你可以捕获每个特定的异常类,或者在Java 7 中使用多捕获

try {
do regular code that can throw exceptions
} catch(Exception e) {
it catches every Exception that is a subclass of Exception.
You handle every exception raised in the try block above by the same way
}

如果你想以不同的方式处理异常,例如打印不同的消息,只需像下面的例子一样:

try {
do sth
} catch (SpecificExceptionclass sec) {
do sth specific for this exception
} catch (AnotherExceptionClass aec) {
do sth else
}

或者只需在Java7中使用Multiatch,如果您想对某些特定的异常类进行相同的异常处理:

try {
do sth
} catch (SpecificExceptionclass | AnotherExceptionClass e) {
do sth specific for this exception
}

为了实现代码中抛出的不同异常,方法至少应该抛出不同的异常。在使用file.exists()和file.delete()的示例中,代码只抛出了一个IOException,因此没有使用特定的异常处理。

我认为将代码放在返回true或false的函数中是个好主意。

1:True表示文件不存在并且已创建
2:False表示文件存在并且已删除
3:如果文件存在但无法删除,则为异常

还提供了一个单独的功能来确定文件是否存在

位于函数顶部的javadoc应该解释以上内容,这样函数的调用者就不必查看它们的内容来确定如何使用它们

注意,异常是一个不寻常的事件,不应该抛出以指示插入/删除的状态。它应该保留用于呼叫方通常不会遇到的异常情况

关于例外的注意事项:如果你有一个大型项目,有1000个类,每个类平均有20个函数,那就是20000个函数。在每个函数中添加过多的异常处理(例如检查作为参数传入的null)是不现实的。解决方案是用java语言(FileIO)处理已检查的异常,并让(大量)未检查的异常在函数调用链中波动,直到您离开所有业务逻辑并准备显示结果。只有当你想在重新引发异常之前向异常添加额外信息时,你才能捕捉到它们。例如:添加抛出的SQLExeption记录的主键值,这样你就知道是什么记录导致了问题。在返回到用户之前,记录堆栈跟踪并向用户显示一条简化的消息(而不是堆栈跟踪)。函数的调用者应该阅读它的javadoc来了解如何使用它。如果他违反了你的javadoc,函数可能会抛出异常,也可能不会抛出异常。他有责任遵循javadoc。最后一点:您的项目应该为整个项目制定通用的编码策略,以防止调用方意外引入某些类型的异常,例如:除非在其javadoc中指定,否则所有函数都不会接收null作为参数,或者将返回null。除非在其javadoc中指定,否则所有函数都将正确地接受空列表或空字符串作为参数(或返回)。

最新更新