我一直在网上搜索和研究一些书籍,但给出的例子有限,我仍然对用户定义的例外有一些疑问。
使用以下代码作为示例:
//Conventional way of writing user-defined exception
class IdException extends Exception
{
public IdException(String s)
{
super(s);
}
}
class Product
{
String id = new String();
public Product(String _id) throws IdException
{
id = _id;
//Check format of id
if (id.length() < 5)
throw(new IdException(_id));
}
}
似乎编写用户定义的异常的传统方式几乎总是相同的。在用户定义的异常的构造函数中,我们总是调用super(msg)
。这引发了一个问题:如果以这种方式实现大多数异常,那么所有这些异常之间有什么区别?
例如,我可以有多个用户定义的异常,但所有似乎都做同样的事情,没有任何差异。 (这些例外中没有实现,是什么使它们起作用?)
示例:
class IdException extends Exception
{
public IdException(String s)
{
super(s);
}
}
class NameException extends Exception
{
public NameException(String s)
{
super(s);
}
}
class ItemException extends Exception
{
public ItemException(String s)
{
super(s);
}
}
QUE:所以我们(例如)不应该在异常类中实现id
的检查吗?如果不是所有异常类似乎都做同样的事情(或者没做任何事情)。
在异常中执行检查的示例:
class IdException extends Exception {
public IdException(String s)
{
super(s);
//Can we either place the if-statements here to check format of id ?
}
//Or here ?
}
答案 0 :(得分:2)
理想情况下,您不应在Exception中实现业务逻辑。 Exception告知有关异常行为的信息。在Custom Exception中,您可以自定义该信息。
找到best practice来编写自定义异常。
答案 1 :(得分:0)
我们已经在java中定义了很多异常。所有人都做同样的事情:to notify user about the problem in code
。
现在假设我们只有一个异常,那么抛出异常时我们怎么能发生错误。毕竟,名字很重要。
答案 2 :(得分:0)
要以您的示例为例,我将通过格式化提供的数据创建更详细的消息:
public IdException(String id, String detail) {
super(String.format("The id \"%s\" is invalid: %s", id, detail));
}
throw new IdException(_id, "Id too short.");
这样,IdException
类中除了在id
字符串中提供给定值(e.getMessage()
)和详细消息之外没有真正的逻辑,因此调试和日志记录很容易阅读和代码本身也很简单:
Id
_id
有问题,即它太短了。因此我们把它扔回来电。
此外,当您在代码中抛出不同类型的异常时,它允许调用者代码以不同方式处理每个异常类型:
try {
getItem(id, name);
} catch (IdException ex) {
fail(ex.getMessage()); // "The Id is bogus, I don't know what you want from me."
} catch (NameException ex) {
warn(ex.getMessage()); // "The name doesn't match the Id, but here's the Item for that Id anyways"
} catch (ItemException ex) {
fail("Duh! I reported to the dev, something happened");
emailToAdmin(ex.getMessage()); // "The Item has some inconsistent data in the DB"
}
答案 3 :(得分:-1)
class MyException extends Exception{
int x;
MyException(int y) {
x=y;
}
public String toString(){
return ("Exception Number = "+x) ;
}
}
public class JavaException{
public static void main(String args[]){
try{
throw new MyException(45);
}
catch(MyException e){
System.out.println(e) ;
}
}
}
output: Exception Number = 45