Try-Catch 与 If-Else |我应该争取在这方面使用 If-Else 还是只使用 Try-Catch?

Try-Catch vs If-Else | Should I fight to use If-Else in this or just go with the Try-Catch?

总结


我接到了设置管理软件的任务(对于小规模的艺术家,所以他们的硬件绝对可以应付),但是,我更愿意在将其交给他们之前尽可能提高效率.主要功能已经完成,现在主要只是润色和优化。

代码


        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只是用来快速完成的,真正的异常是已知的。给出的错误是"Nullable object must have a value."System.InvalidOperationException

问题


最好像我现在这样处理这个问题,还是 If-Else 会更好?如果是这样,我将如何实施它?

Exception e was only used to get it done quickly and the true exception is known. The error given is "Nullable object must have a value." System.InvalidOperationException

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

Is it best to handle this as I am doing or would If-Else work better?

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

And if so, how would I go about implementing it?

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);
}

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

  • ArgumentNullException(如果参数值为空)
  • 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
}

由于您已经在使用 TryParse,因此无需使用 try ...catch 块。它不仅效率低下,而且也不干净。就拿DateTime.TryParse的return值来做决定吧

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

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

我想建议在这种情况下使用 if else 语句而不是异常,它也会得到优化,并让您有机会针对特定情况给出有意义的消息。

异常处理应仅用于处理未知情况。