我是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();
}
}
....中断if...then
块。我不确定如何在try...catch
中插入if...then
。有没有办法做到这一点?或者我的原始代码是否捕获与file
块中定义的try
上的任何操作相关的每个错误,我需要将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"
}
}
处理此类情况的最合适方法是什么?
答案 0 :(得分:4)
您应该将try/catch
视为任何其他声明。所以你可以将它放在if/then/else
语句的两个分支中的任何一个,但它必须是完整的内部:
if(statement){
...
try{
...
}catch(...){
...
}
...
}else{
...
try{
...
}catch(...){
...
}
...
}
如果必须捕获多个异常,可以通过多个捕获部分实现此目的:
try{
...
}catch(Exception1 e1){
...
}catch(Exception2 e2){
...
}catch(Exception3 e3){
...
}
答案 1 :(得分:0)
首先,您应该检查是否有任何方法可以抛出任何特定的异常。您可以通过查看Javadoc或使用您喜欢的IDE来完成此操作。
如果你将Exception作为Exception类捕获,它会捕获每个Exception,它是它的子类。
如果您想要进行特定的异常处理,例如对于IOException,如在delete()方法中,您可以捕获每个特定的Exceptionclass或在Java 7中使用multi-catch
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
}
或者只是在Java 7中使用Multicatch,如果你想对某些特定的异常类进行相同的异常处理:
try {
do sth
} catch (SpecificExceptionclass | AnotherExceptionClass e) {
do sth specific for this exception
}
要实现代码中抛出的不同异常,方法至少应该抛出不同的异常。在使用file.exists()和file.delete()的示例中,代码只抛出了IOException,因此不会使用特定的异常处理。
答案 2 :(得分:0)
我认为将代码放在返回true或false的函数中是个好主意。
1:True表示文件不存在并且已创建
2:False表示文件存在并被删除
3:文件存在但无法删除的例外情况。
还提供单独的功能来确定文件是否存在
您的函数顶部的javadoc应解释上述内容,以便您的函数调用者不必查看其内容以确定如何使用它们。
请注意,异常是一种异常事件,不应抛出异常以指示插入/删除的状态。它应该保留给呼叫者通常不会遇到的异常情况。
关于例外的说明:如果你有一个包含1000个类的大项目,每个类平均有20个函数,那就是20000个函数。使用过多的异常处理来削减每个函数是不切实际的(例如检查作为参数传入的空值)。解决这个问题的方法是处理java语言中的已检查异常(FileIO),让(大量)未经检查的异常会影响函数调用链,直到您保留所有业务逻辑并即将显示结果。如果要在重新抛出异常之前向异常添加其他信息,则只能捕获它们。示例:添加要抛出的SQLExeption记录的主键值,以便您知道哪条记录导致了问题。在您返回用户之前,记录堆栈跟踪并向用户显示简化消息(而不是堆栈跟踪)。函数的调用者应该读取它的javadoc以了解如何使用它。如果他违反了您的javadoc,该函数可能会也可能不会抛出异常。他的责任是跟随javadoc。最后一点:您的项目应该具有整个项目的通用编码策略,以防止调用者意外地引入某些类型的异常,例如:所有函数都不会被视为接收空值作为参数或将返回null,除非在其javadoc中指定。除非在javadoc中指定,否则所有函数都将接受作为参数(或返回)空列表或空字符串。
答案 3 :(得分:0)
您想要的是创建自己的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
}
}