我如何扫描我的代码并获得所有可能的抛出MyException errorCode的execute()函数?
错误const:
public enum ErrorId {
OK(1),
REPORT_LIMIT(2),
NOT_UNIQUE_FIELD(3),
INCORRECT_PROPERTY(4);
private int id;
ErrorId(int id) {
this.id = id;
}
}
例如我有' MyException' :
public class MyException extends Exception {
@Getter
protected final ErrorId errorCode;
public MyException(ErrorId errorCode) {
this.errorCode = errorCode;
}
}
用方法分类:
public class MyClass {
public void execute() throws MyException {
//do something 1
...
if(isSomethingWrong1) throw new MyException(ErrorId.REPORT_LIMIT);
executeMethod2();
//do something N
if(isSomethingWrongN) throw new MyException(ErrorId....);
}
public void executeMethod2() throws MyException {
// ...
throw new MyException(ErrorId....)
// ...
}
}
答案 0 :(得分:2)
我不认为这里有你喜欢的答案。
反思在这种情况下不会起作用,因为它关注的是类型,而不是价值。编译器也可以在这里帮助你,因为如果错误代码是通过变量传入的,那么在运行时,所有的赌注都会关闭 - 值可能是你正在使用的类型的任何可能值。如果您使用enum
代码值,那么您就拥有了所有可能值的已知列表,但您不知道哪些是实际使用的没有读取该功能的任何特定功能。静态分析工具可能在这里有用,但您需要继续运行它以使这些信息保持最新。
然而,一切都不会丢失。正如我在第二条评论中所说,你有另一种选择 - 提取子类。让我们考虑一下Exception
类的定义。
public abstract class MyException extends Exception {
@Getter
protected final ErrorId errorCode;
public MyException(ErrorId errorCode) {
this.errorCode = errorCode;
}
}
它和你现在一样,但它是abstract
。本课程开放以供扩展。所以我们可以像这样创建一个子类ReportLimitException
:
public class ReportLimitException extends MyException {
public ReportLimitException() {
super(ErrorId.REPORT_LIMIT);
}
}
和另一个像这样的人,例如:
public class DuplicateFieldException extends MyException {
public DuplicateFieldException() {
super(ErrorId.NOT_UNIQUE_FIELD);
}
}
现在,任何给定的方法都可以通过其throws
子句通告它使用的特定异常。事实上,这就是该条款存在的原因。
public void execute() throws ReportLimitException, DuplicateFieldException {
//do something 1
//...
if(isSomethingWrong1) throw new ReportLimitException();
executeMethod2();
//do something N
if(isSomethingWrongN) throw new DuplicateFieldException();
}
此时,如果你明确地宣传了例外,那么你已经实现了你的目标,代价是一些潜在的长投注条款(这实际上应该暗示你的方法可能做得太多了)无论如何工作)。或者,如果您不想想要宣传这样的每个例外,您也可以使用您的IDE"找到参考资料"功能,用于定位创建这些异常的每个位置(查找对构造函数的引用)。
调用代码甚至不必知道变化。它可以继续使用这样的代码:
try {
// stuff that might throw any of your exceptions
} catch (MyException ex) {
switch (ex.getErrorCode()) {
// handle the cases...
}
}