用于处理用户输入的Java异常

时间:2013-10-24 20:25:48

标签: java validation exception input

通过例外回应逻辑错误的用户输入是否正确?

以下是一个例子:

我们有很多公司,每家公司都有很多员工。每家公司都有一个id,每个员工都有一个id。如果用户想要从特定公司删除员工,但他指定的comapny不存在,是否可以抛出类似CompanyNotExtistsException的异常?

如果我返回true或false,我无法回复GUI中的用户,其中包含员工未被删除的消息 - 如果他不存在或者公司不存在。

5 个答案:

答案 0 :(得分:2)

这是软件界很多争论的话题。像@thatidiotguy这样的人认为异常在这种情况下非常合适。还有像我这样的其他人认为异常只应用于出现问题的特殊情况;你的场景让我感到震惊,因为可以通过条件轻松解决备用流程。

但我对此并不信任。如果你走异常路线,只需记住两件事:

  • 确保它是@thatidiotguy隐含的已检查异常。
  • 确保您的异常不会重复Java提供的现有异常来说明相同的事情。例如,如果客户端提供了您期望数字的字符串,请不要构成您自己的“InvalidFormatException”或其他内容。使用Java的内置IllegalArgumentException

希望有所帮助。

答案 1 :(得分:1)

抛出异常是完全可以接受的。应该有一个try / catch块围绕GUI代码中业务方面的调用,以便在业务逻辑抛出该异常时显示错误消息。

e.g。

public class GUI {

     private UserManager manager;

     public void deleteUser(User user) {
         try{
             manager.deleteUser(user);  
         }
         catch(CompanyNotExistsException e) {
             //display an error message to user
         }
     }
}

public class UserManager {

    public void deleteUser(User user) throws CompanyNotExistsException {
           if(!this.companyExists(user.getCompany()) {
               throw new CompanyNotExistsException();
           }
    }
}

根据@Vidya下面所说的,我想澄清一下,我认为应该进行客户端验证,以便将此异常作为最后的手段抛出。编码器应尽其所能在出于性能和可用性原因而在遇到服务器端代码之前尝试检测错误。

答案 2 :(得分:1)

如果没有真正对它做任何事情就抛出异常是不行的(除非你不打算使用它,但是在其他情况下你会记录它以便他们知道如何捕获它)。现在你的情况下,当公司不存在时扔它是好的,然后抓住它可以很容易地让你知道发生了什么,你可以“失败优雅”。

public void deleteEmployee(Employee e, Company c) throws CompanyNotExistsException{...}

然后你抓住它

try {
//do your work here
}
catch(CompanyNotExistsException e){/*Fail le graceful*/}
catch(Exception){/*For good measure*/}

答案 3 :(得分:0)

有没有办法防止错误的状态,而不是抛出异常?换句话说,有没有办法让他们只能选择该公司的有效公司和有效员工?作为用户,我更喜欢只能选择有效的条目而不必解读我的错误。即使是一个很好的错误对话框。但这是你的设计决定,以防止或处理错误的状态。

抛出异常是好的,只要您告知用户出了什么问题并且不会意外退出。在我所拥有的一个遗留GUI项目中,所有与UI相关的异常都对该问题有了很好的描述,所以我只需要这样一个JMessagePane(?忘记确切的类)。在另一个方面,将报告UI问题,程序(因此程序会话)将终止,用户需要从头开始。

答案 4 :(得分:0)

我认为相反,您可以停止删除并将消息传达给用户。 说公司和员工信息都在数据库中。因此,在删除之前,您必须检查 -    公司和员工是否存在 根据存在情况,您可以继续删除。

步骤 -

if company exists then
   if employee  exists then 
     delete  
     message:= deleted
   else
     message:= employee doesn't exist
else
     message:= company doesn't exist

但你可以使用例外没有限制。像使用try-catch显示的其他人一样。