0

我正在一个项目中为一些打算从其他项目调用的数据库操作编写公共函数。直接写代码,我可以采用以下方法:

public int GetCount(Apple apple, Orange orange)
{
    try 
    { 
       // query; 

       return 1000;
    } 
    catch 
    { 
        // log it
        return -1; 
    }
}

或者

public int? GetCount(Apple apple, Orange orange)
{
    try 
    { 
       // query; 

       return 1000;
    } 
    catch 
    { 
        // log it
        return null; 
    }
}

或者

public bool GetCount(Apple apple, Orange orange, out int count)
{
    count = -1;
    try 
    { 
       // query; 

       count = 1000;
       return true;
    } 
    catch 
    { 
        // log it
        return false; 
    }
}

我目前对其他业务对象执行“null”方式,例如:

public Apple GetApple(Orange orange)
{
    try 
    { 
       // query; 

       return apple;
    } 
    catch 
    { 
        // log it
        return null; 
    }
}

调用者检查返回的值是否为null并相应地弹出错误消息。所以我也倾向于将int?值类型用作返回类型。但我很想知道这些东西的可接受设计或鼓励实践是什么。

编辑:如果我把 try catch 放在调用者周围,那我的代码库不会到处都是 try catch 吗?从被调用者那里捕获异常不是更容易,这样调用它的所有函数都不需要关心吗?如果被调用者捕捉到错误并让调用者知道发生了一些错误,那有什么问题?

4

4 回答 4

4

嗯,这是相当主观的,你不会得到标准化的答案,但是框架设计指南这本书是开发约定的好资源,它指出“不要通过捕获非特定异常来吞下错误,例如Exceptionor SystemException”。如果您吞下它并返回一些神奇的值,包括null,您将无法识别系统故障的根本原因。

就个人而言,我会去

public int GetCount(Apple apple, Orange orange)
{
    try 
    { 
       return // query; 
    } 
    catch 
    { 
        // log it
        throw;
    }
}

另一个个人观点 - 我花了太多时间诊断和调试,以了解系统为什么不工作,然后,最后,只是为了发现异常被默默地记录和吞下。现在,当我遇到类似catch(Exception e) { return null; }.

于 2013-02-09T12:17:26.953 回答
4

吞下异常是不好的做法。

如果该方法无法处理异常,请将其冒泡给调用者:

public int GetCount(Apple apple, Orange orange)
{
    try 
    { 
       // query; 

       return 1000;
    } 
    catch 
    { 
        // log it
        throw;
    }
}
于 2013-02-09T12:12:04.260 回答
1

int提供的值对于域而言显然不合法的情况下,并且不需要default<int>为零以外的任何值,我认为Nullable<T>. 这些Nullable<int>类型对于调用者来说很烦人,因为有必要测试 null ,然后在使用前将值提取到其他存储位置。如果一个人犯了这样的错误:

if (res.HasValue)
  for (i=0; i<res.Value; i++)
    ....

那么循环开销可能会是原来的两倍多:

if (res.HasValue)
{
  int resValue = res.Value;
  for (i=0; i<resValue; i++)
    ....
}

但是要求调用者创建一个额外的变量来避免荒谬的循环开销似乎很麻烦。

于 2013-02-11T14:31:03.947 回答
0

我也会使用int?。重要的是要注意,这有助于您使用所有号码 - 而不是保留特定号码来识别状态。

这就是什么CC++缺乏,它使用整数来传达状态,无意中保留了一个数字以供特殊使用。

于 2013-02-09T12:13:26.457 回答