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 语句而不是异常,它也会得到优化,并让您有机会针对特定情况给出有意义的消息。
异常处理应仅用于处理未知情况。
总结
我接到了设置管理软件的任务(对于小规模的艺术家,所以他们的硬件绝对可以应付),但是,我更愿意在将其交给他们之前尽可能提高效率.主要功能已经完成,现在主要只是润色和优化。
代码
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 语句而不是异常,它也会得到优化,并让您有机会针对特定情况给出有意义的消息。
异常处理应仅用于处理未知情况。