0

通过异常响应逻辑上不正确的用户输入是否正确?

这是一个例子:

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

如果我返回 true 或 false,我无法在 GUI 中回复用户为什么没有删除员工的消息 - 如果他不存在或公司不存在。

4

5 回答 5

2

这是软件社区中很多争论的话题。像@thatidiotguy 这样的人认为,在这种情况下例外是完全合适的。还有一些像我这样的人认为异常应该只用于实际出现问题的特殊情况。您的场景让我印象深刻,因为它可以通过条件轻松解决。

但我对此也不虔诚。如果你走异常路线,只需要记住两件事:

  • 确保它是@thatidiotguy 暗示的检查异常。
  • 确保您的异常不会重复 Java 提供的现有异常以说明相同的内容。例如,如果客户在您期望数字的地方提供了一个字符串,请不要编造您自己的“InvalidFormatException”之类的东西。使用 Java 的内置IllegalArgumentException.

希望有帮助。

于 2013-10-24T20:37:20.987 回答
1

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

例如

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 下面所说的,我想澄清一下,我认为应该进行客户端验证,以便将此异常作为最后的手段抛出。出于性能和可用性的原因,编码人员应该尽其所能尝试并检测错误,以免它们遇到服务器端代码。

于 2013-10-24T20:27:57.827 回答
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*/}
于 2013-10-24T20:33:46.160 回答
0

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

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

于 2013-10-24T20:33:33.677 回答
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 显示的一样。

于 2013-10-24T21:00:42.583 回答