相关疑难解决方法(0)

为什么不将异常用作常规控制流?

为了避免我可以用Google搜索的所有标准答案,我将提供一个你可以随意攻击的例子.

C#和Java(和太多的人)有很多类型的一些"溢出"的行为,我不都不像(如type.MaxValue + type.SmallestValue == type.MinValue例如: int.MaxValue + 1 == int.MinValue).

但是,看到我的恶性,我会通过扩展这种行为来增加对这种伤害的一些侮辱,让我们说一个Overridden DateTime类型.(我知道DateTime密封在.NET中,但是为了这个例子,我使用的是一种与C#完全相同的伪语言,除了DateTime没有密封的事实).

被覆盖的Add方法:

/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan. 
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and 
/// continue from DateTime.MinValue. 
/// </returns>
public DateTime override Add(TimeSpan …
Run Code Online (Sandbox Code Playgroud)

language-agnostic exception

184
推荐指数
12
解决办法
4万
查看次数

为什么,您更喜欢例外或返回代码?

我的问题是大多数开发人员更喜欢错误处理,异常或错误返回代码.请具体说明语言(或语言家族)以及为什么您喜欢其中一种语言.

我出于好奇而问这个问题.我个人更喜欢错误返回代码,因为它们不那么具有爆炸性,并且如果不想要,也不会强制用户代码支付异常性能损失.

更新:感谢所有答案!我必须说,虽然我不喜欢代码流与异常的不可预测性.关于返回代码(以及他们的哥哥句柄)的答案会给代码添加大量的噪音.

language-agnostic exception

80
推荐指数
8
解决办法
2万
查看次数

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

我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的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
查看次数

抛出异常来控制流程 - 代码味道?

考虑一下这段代码(特别是Java):

public int doSomething()
{
    doA();

    try {
        doB();
    } catch (MyException e) {
        return ERROR;
    }

    doC();
    return SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

在哪里doB()定义为:

private void doB() throws MyException
Run Code Online (Sandbox Code Playgroud)

基本上,MyException仅在doB()满足某些条件的情况下存在(这不是灾难性的,但确实需要以某种方式提高这个条件),以便doSomething()知道退出时出错.

你是否发现使用异常,在这种情况下控制流量,可以接受?或者这是代码味道?如果是这样,你会如何重构这个?

java exception-handling

6
推荐指数
5
解决办法
5005
查看次数

在.NET中使用try-catch进行流量控制是"糟糕的"吗?

我刚刚在一个项目中找到:

try
{
    myLabel.Text = school.SchoolName;
}
catch
{
    myPanel.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

我想和开发人员谈谈,而不是写这个,说发生null异常(因为school理论上可能是null,不是myLabel)会使计算机发出三次蜂鸣声并睡两秒钟.但是,我想知道我是否错过了关于这一点的规则.显然,这不是try/catch的预期用途,但这是不好的,因为它因性能考虑而无视意图或不好?我觉得这很糟糕,但我想说的不仅仅是"那真的很糟糕".

c# try-catch

6
推荐指数
3
解决办法
4325
查看次数

使用try {...} catch(..){...}代替转到

是不好的做法使用像goto一样的试试?例如,简单的代码

try{
    if(argc<2){
        std::cout<<"no inputfile"<<std::endl;
        throw 1;
    }
    STARTUPINFO cif;
    ZeroMemory(&cif,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
    if(FALSE==CreateProcess(argv[1],NULL,NULL,NULL,FALSE,NULL,NULL,NULL,
                            &cif,&pi)){
        printf("smth is wrong");
        throw 1;
    }
    WaitForSingleObject(pi.hProcess, INFINITE);
    GetExitCodeProcess(pi.hProcess, &exitCode);
    std::cout<<"Process return"<<exitCode<<std::endl;
    throw 1;
}
catch(int a){
    printf("press Enter");
    getchar();
}
Run Code Online (Sandbox Code Playgroud)

c++ goto try-catch

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

我应该使用Try Catch Block来实现我的业务逻辑吗?

假设我需要这样的东西.(这段代码很错误,但只是一个例子).这段代码不是我的问题!这只是一个例子.我知道如何使用if else语句编写它.我正在考虑一个更复杂的背景!

int[] arraynums = new int[3] {1,2,3};
int Sample = 0;
try
{
Sample = arraynums[3];
}
catch
{
Sample=4;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我可以使用一个不会遇到错误的替代逻辑.但是如果我使用try catch块,我仍然可以减少代码.是否建议使用try catch块来解决逻辑?如果不是,为什么呢?

c# c++ java

0
推荐指数
1
解决办法
1019
查看次数