Try-Catch与If-Else |我应该在这种情况下争取使用If-Else还是只使用Try-Catch?

时间:2019-03-13 04:15:01

标签: c# control-structure

摘要


我已经被赋予了设置管理软件的任务(对于小型美术师来说,他们的硬件肯定可以应付),但是,我希望在提供给他们之前使它尽可能高效。主要功能已完成,现在主要是修饰和优化。

代码


        DateTime DueDate;
        try
        {
            DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
            out DueDate);
        }
        catch(Exception E)
        {
            MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
                MessageBoxButton.OK, MessageBoxImage.Warning);
            DueDate = DateTime.Parse(DateTime.Now.ToShortDateString());
        }

注意:Exception e仅用于快速完成它,真正的异常是已知的。给出的错误是“可为空的对象必须具有值”。 System.InvalidOperationException

问题


最好是照我的方式处理这个问题,否则If-Else会更好吗?如果是这样,我将如何实施它?

4 个答案:

答案 0 :(得分:3)

由于您已经在使用TryParse,因此无需使用try ...catch块。不仅效率低下,而且也不干净。只需取DateTime.TryParse的返回值并做出决定即可。

var isDate = DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),

然后if (isDate){...} else {...}

答案 1 :(得分:2)

  

异常e仅用于快速完成它,真正的异常是已知的。给出的错误是“可为空的对象必须具有值”。 System.InvalidOperationException

您怎么知道在运行时会有不同的例外?可以说NullReferenceException(例如)。请记住,所有异常都实现Exception对象。

  

最好是照我的方式处理这个问题,否则If-Else会更好吗?

您需要更好地处理错误。您知道它可能为Nullable,因此您需要在继续操作之前检查它是否有价值。您应该注意警告并优雅地处理它们。

  

如果是的话,我将如何实施它?

try
{
    if(dteCommission.SelectedDate.HasValue) 
    { 
        DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
                    out DueDate); 
    } else{
        MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                DueDate = DateTime.Parse(DateTime.Now.ToShortDateString());
    }
} 
catch(Exception e)
{
    Log.LogError(e);
    MessageBox.Show("Unhandle error occurred please call Admin", "Alert",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
}

答案 2 :(得分:1)

如果您承诺使用tryparse,那么使用If-Else是更好的方法,这取决于tryparse方法的输出。但是如果您使用Parse,则很可能会遇到以下例外之一:

  • ArgumentNullException(如果参数值为null)
  • FormatException(如果参数值不是整数值或格式不正确)
  • FormatException(如果参数值超出整数范围)

因此最好进行异常处理。

第一种方法:

var isParsable = DateTime.TryParse(dteCommission.SelectedDate.Value.Date.ToShortDateString(),
out DueDate);
if (isParsable)
{
     //Continue With your Procedure
}
else
{
     MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
     MessageBoxButton.OK, MessageBoxImage.Warning);
}

对于第二种情况,您可以选择:

DateTime DueDate;
try
{
     var DueDate = DateTime.TryParse(dteCommission.SelectedDate.Value.ToString());

}
catch (Exception E)
{
     MessageBox.Show("Due Date wasn't set. Defaulting to current date.", "Alert",
     MessageBoxButton.OK, MessageBoxImage.Warning);
     //also you can you the exception type to make it clear for use if it is
     // an exception of Null, Format or Argument
}

答案 3 :(得分:0)

我想建议在这种情况下使用if else语句,而不是在例外情况下使用它,它也会被优化,并为您提供有意义的信息,以特定于该情况。

异常处理应仅用于处理未知方案。