【发布时间】:2015-07-24 19:20:53
【问题描述】:
我正在我自己的个人图书馆中使用SikuliX's API。这个想法是在外部项目中单独引用我的库,其中包含我需要的 SikuliX 部分。
现在,SikuliX 抛出了 FindFailed 异常,这是我需要的。我试着做:
public class FindFailed extends org.sikuli.script.FindFailed {
FindFailed(String msg) { super(msg); }
}
这似乎是有道理的。但是,当尝试在其中一种方法中使用 throws 语句时:
import org.mylibrary.exceptions.FindFailed;
public static boolean clickFinishButton() throws FindFailed {
pattern = PatternManager.loadPattern("my-image.png");
screen.wait(pattern, 10);
region = screen.exists(pattern);
region.click(pattern);
return true;
}
我仍然收到Unhandled exception type FindFailed 警告。将其改回原来的org.sikuli.script.FindFailed 当然可以,但是在外部项目中使用try-catch 将需要我重新添加相关的SikuliX jar 文件。
我想做的,只是简单地包装 SikuliX 抛出的 FindFailed 异常,并在我的库内部和外部使用它。
所有这一切的主要目标是用我自己的附加方法等封装另一个 API,这样当我引用这个库时,以后的项目也不必引用 SikuliX 的 jar。
- - - - My Library - - - <—————— External Project
| |
| SikuliX |
- - - - - - - - - - - -
就目前而言,我需要执行以下操作:
- - - - My Library - - - <—————— External Project
| | |
| SikuliX | |
- - - - - - - - - - - - v
SikuliX (Again)
到目前为止,我已经进行了如下更改,似乎可行。
public class FindFailed extends Exception {
public FindFailed(Throwable cause) { super(cause); }
}
我现在不扩展任何第三方例外。相反,我继续执行以下操作:
public static boolean clickNewScan() throws FindFailed {
pattern = PatternManager.loadPattern("my-image.png");
region = screen.exists(pattern);
try {
screen.wait(pattern, 60);
region.click(pattern);
} catch (org.sikuli.script.FindFailed e) {
throw new FindFailed(e);
}
return true;
}
【问题讨论】:
-
您提到 - “在外部项目中使用 try-catch 将需要我重新添加相关的 SikuliX jar 文件,这不是我想要的”- 因为您的自定义异常正在从库中扩展异常类,您将需要在类路径中使用该库。没有别的办法
-
你设置完成的可能不是一个好主意毕竟,即使是FindFailed属于不同包的问题:Java theory and practice: The pseudo-typedef antipattern
-
存在一些有效点。通过描述我的想法以及我这样做的原因,我或许可以更简短地澄清这个问题。