相关疑难解决方法(0)

如何避免使用异常进行流量控制?

我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的get方法:

public CustomObject get(String key, Date ifModifiedSince)
Run Code Online (Sandbox Code Playgroud)

基本上该方法应该返回CustomObjectkeyif 关联的,并且只有在对象被修改之后才会返回ifModifiedSince.如果存储系统不包含,key则该方法应返回null.

我的问题是:

如何处理其中关键的存在,但该对象的情景已经被修改?

这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序.这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据).

我正在权衡的解决方案是:

  1. 当存储系统不包含时,抛出自定义异常 key
  2. ifModifiedSince失败时抛出自定义异常 .
  3. 将状态属性添加到CustomObject.要求来电者查看房产.

我对这三个选项中的任何一个都不满意.我不喜欢选项1和2,因为我不喜欢使用流控制的异常.当我的目的是表明没有价值时,我也不喜欢返回.

尽管如此,我倾向于选择3.

有没有我不考虑的选择?有没有人对这三种选择中的任何一种都有强烈的感受?


这个问题的答案,转述:

  1. 提供一个contains 方法并要求调用者在调用之前调用它get(key, ifModifiedSince),如果key不存在则抛出异常,如果没有修改object则返回null.
  2. 将响应和数据(如果有)包装在复合对象中.
  3. 使用预定义常量表示某个state(UNMODIFIED, KEY_DOES_NOT_EXIST).
  4. 调用者实现了用作回调的接口.
  5. 设计很糟糕.

为什么我不能选择答案#1

我同意这是理想的解决方案,但我已经(不情愿地)被解雇了.这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3.这意味着一种contains方法需要往返于存储系统,这在大多数情况下会进行另一次往返.因为这会花费时间和金钱,所以不是一种选择.

如果没有这个限制,这将是最好的方法.

(我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短.显然它是相关的.)


结论:

在阅读完所有答案之后,我得出的结论是,在这种情况下,包装器是最好的方法.基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题).

java exception return-type control-flow

9
推荐指数
2
解决办法
3941
查看次数

方法返回状态:bool,string,const ...(PHP)

这个问题:从Java中的方法返回状态标志和消息的最佳方法与我的相似,但我会用PHP而不是Java(这可能会略有不同).

问题:

有一种方法可以有一个成功的结果(这可能会变成更成功的结果)或一个"有问题"的结果.后者意味着操作失败,但知道原因也很重要.想象一下Authentication类的方法:

public function login($name, $password)
{
    if (successful_authentication)
    {
        report success
    }
    else
    {
        report failure, explain why (e.g. wrong name/pass, user banned)
    }
}
Run Code Online (Sandbox Code Playgroud)

为成功和失败回报真假都是微不足道的,但如何报告失败的原因呢?

可能的解决方案:

  • 返回true或false并编写另一个方法(getStatus())来获取特定问题:这对我来说有点尴尬
  • 使用例外:因为禁止用户并不例外(如果用户在键入时会因此网站上的另一位作者而死,例外情况就是例外)在这些情况下使用异常将是完全错误的(但是如果查询失败,方法可能抛出数据库异常)
  • 成功时返回true,失败时返回一个字符串,错误代码表示问题:使用PHP可以通过这种方式获得漂亮的干净块,如下所示:

    $loginStatus = $auth->login('name', 'pass');
    if ($loginStatus === true)
    {
        doSomething();
    }
    else
    {
        if ($loginStatus == 'wrong_login_data')
        ...
        elseif ($loginStatus == 'banned')
        ...
        // or with an array full of error messages:
        echo $erroMessages[$loginStatus];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 返回一般状态(状态)对象:非常优雅的解决方案以及面向未来的(如果状态数量不同或以后应该返回其他数据,则没有问题),也许是最好的一个:

    $loginStatus = $auth->login('name', 'pass')
    if ($loginStatus->isSuccess)
    ...
    else
        echo $errorMessages[$loginStatus->errorCode]; …
    Run Code Online (Sandbox Code Playgroud)

php state status return-value

6
推荐指数
1
解决办法
347
查看次数

在java中处理验证的好做法是什么

我有 3 种方法,其中我在大多数内部方法中进行验证。我想知道验证是否失败以及验证失败时的错误消息。我知道我可以使用异常来执行以下操作来传递错误消息..

 String methodA(parms){
        try{
            
            return methodB(params);
        }
        catch(UserDefinedRuntimeException ure){
            return ure.getMessage();
        }
        
    }
    
    String methodB(params){
        try{    
           return  methodC(params);
        }
        catch(UserDefinedRuntimeException ure){
            throw ure;
        }
        catch(Exception otherException){
            //handle Exception
            otherException.printStackTrace();
        }
    }
    
    String methodC(params){
          if(params.equals("A")||params.equals("B")||params.equals("C")){
             return dosomething();
          }
          else{
            throw UserDefinedRuntimeException("invalid input :params should be in [A,B,C]");
          }
    }
Run Code Online (Sandbox Code Playgroud)

但问题是很多人说创建异常很昂贵

所以我通过谷歌搜索我发现了另一种方法

从 Java 中的方法返回状态标志和消息的最佳方法

像下面..

class Response{
        int status;
        String errMsg;
    }
    
    
    String methodA(params){
        
        Response response = methodB(params);
        if(response.status == 1){
            return "success";
        }
        else{
            return response.errMsg;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java validation exception

5
推荐指数
1
解决办法
4987
查看次数

Java字符串参数

我来自.net背景,想知道创建一个方法的可接受方式,该方法返回一个布尔值并修改一个通过参数传入的字符串.我理解字符串在Java中是不可变的,因此下面的代码片段将始终产生一个空字符串.我被限制只返回布尔值.不能抛出例外情况.如果我需要将String类包装在一个StringHolder中,我可以在哪个包中找到它.

public static void DoStuff()
{
    String msg = "";
    if (GetMessage(msg))
    {
       System.out.println(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

java string parameters idioms

2
推荐指数
3
解决办法
1万
查看次数