我目前正在使用Java包装C库,使其更易于使用并在OO编程中工作。 C库使用错误代码(int返回值)和Out-Parameter进行数据操作。我不一定是错误代码的粉丝,所以我想创建一些自定义的异常类,如果我的库检测到错误代码而不是“成功”,我可以抛出它。
唯一的问题是每个方法可能引发的异常数量非常高(可以从每个C库函数返回一些错误代码,例如“Device_Not_Connected”)。自从我上次使用Java编程以来已经有一段时间了,因此,我真的不知道Java中的异常是什么情况。
答案 0 :(得分:3)
那些抛出很多不同异常的方法是不是很糟糕?
如果使用得当,没有!一个例外基本上只是一种可能的返回状态,这超出了该方法的技术目的。例如。如果方法应从设备读取值null或应使用返回类型返回任何值。但抛出一个自定义的DeviceNotConnectedException来声明当你无法读取返回值而不是简单地返回null时出现问题是100%最佳实践。如果10件事可能出错,那么可以说出10个可能的例外情况。
我是否必须处理异常,或者有没有办法忽略它?
当你没有捕获异常时,你必须声明它发生的方法,使用“public void myMethod()抛出MyExcp {..}”等等,在调用此方法的每个方法中,该方法调用者等等上。如果你将它交给main方法并且它没有在那里处理它会使程序崩溃。
如果我可以忽略异常,它是否会冒出调用树(例如在Python中)?
见上文。
除了错误代码和无操作之外,Java中是否有除例外的替代方法?
据我所知,但我不是专家。
答案 1 :(得分:2)
如果连接到IO(文件,设备,用户输入)出现问题,你肯定会抛出异常。您不需要为所有不同的错误代码定义不同的异常类。如果错误代码的处理非常相似,则可以使用相同的异常,例如
throw new IOException("Device not connected");
如果可能的话,你应该避免抛出太多与错误参数相关的异常等。为用户建立检查功能(比如“containsKey”),这样就不需要“试着抓住”这样的东西。
答案 2 :(得分:1)
您可以为Exception类创建一个继承层次结构,以便方法签名定义很少[甚至只有一个]常规Exception类,无论您在方法体中抛出多少特定异常。
public FileResult Download()
{
byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext");
string fileName = "myfile.ext";
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
呼叫者可以自由选择处理特定的例外或一般例外情况。
选项1:
public void myMethod() throws MyGeneralException {
...
throw new MySpecific1Exception();
.....
throw new MySpecific2Exception();
}
选项2:
try {
myMethod();
} catch (MyGeneralException e) {
....
}