gpt4 book ai didi

Java风格: Catching a bunch of slightly different errors

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:02 25 4
gpt4 key购买 nike

在我正在使用 Java 编写的程序中,我必须从文件中读取数据。数据经过格式化,以便每一行都包含构造新对象所需的所有信息。当我解析数据时,我有一个看起来像这样的代码块:

String[] parts = file.nextLine().split(",");

String attr1 = parts[0];
int attr2, attr3;
try{
attr2 = Integer.parseInt(parts[1]);
} catch (NumberFormatException ex){
System.out.println("Could not parse attr2, got " + parts[1] + ".");
return;
}
try{
attr3 = Integer.parseInt(parts[2]);
} catch (NumberFormatException ex){
System.out.println("Could not parse attr3, got " + parts[2] + ".");
return;
}
ClassA attr4 = null, attr5 = null, attr6 = null;
try{
...
} catch (SomeExceptionType ex){
System.out.println("Could not parse attr4, got " + parts[3] + ".");
}
...

我发现自己一遍又一遍地重复相同的简单 try block 。为了缓解这种情况并进一步遵守 DRY 原则,我引入了一些尝试方法:

int attr2 = attemptGetInt(parts, 1, "attr2");
int attr3 = attemptGetInt(parts, 2, "attr3");
ClassA attr4 = attemptGetClassA(parts, 3, "attr4");
...

// Somewhere in the class

public int attemptGetInt(String[] parts, int index, String name) throws SomeOtherException1{
try{
return Integer.parseInt(parts[index]);
} catch (NumberFormatException ex){
throw new SomeOtherException1("Could not parse " + name + ", got " + parts[index] + ".");
}
}

public ClassA attemptGetClassA(String[] parts, int index, String name) throws SomeOtherException2{
try{
return ...
} catch (SomeExceptionType ex){
throw new SomeOtherException2("Could not parse " + name + ", got" + parts[index] + ".");
}
}
...

即使这感觉很奇怪,因为我必须返回很多不同的类型,所有类型都有相同但略有不同的代码,并且每次都需要捕获稍微不同的错误(即我必须创建一个 attemptGetClassBattemptGetClassC 等等,每次都使用类似的代码很多次)。

有没有一种优雅的方式来编写这样的代码?

最佳答案

如果您可以控制输入文件的格式,您可能希望将其更改为带有架构的 XML。这样解析器本身就会为您处理很多此类检查。

但是,从问题的性质来看,我认为格式是固定的。在这种情况下,我建议将语法检查和解析分成每行的单独步骤。

进行语法检查的一种简单方法是使用正则表达式。相当复杂的语法可以用正则表达式进行编码,因此除非文件包含某种嵌套(在这种情况下一定要使用 XML),否则它应该相当简单。

解析的第二步应该只返回异常:-)您仍然需要捕获它们,但将所有捕获收集到一个 block 中是非常好的形式,因为它应该只在调试时使用:在正常操作中,语法检查将在此步骤之前捕获错误。

我的看法是这样的设计更加直观、明显。如果您特别想单独报告每个错误,那么错误报告可能会有缺点。在这种情况下,您需要首先将字符串分解为子字符串(例如使用扫描仪),然后对每个子字符串进行语法检查。

最后一点,对此有不同的看法,但我个人的偏好是不对正常操作中发生的情况使用异常处理。他们不太适合这样做(在我看来)。最好按照我在这里建议的做法:在处理之前使用显式代码检查错误条件,然后对通常不应该发生的事情使用异常。

关于Java风格: Catching a bunch of slightly different errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27308074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com