在C#中处理异常时,如何压缩大量小的Try-Catch块?
在我的对象转换代码中,我有很多:在C#中处理异常时,如何压缩大量小的Try-Catch块?,c#,.net,exception,exception-handling,try-catch,C#,.net,Exception,Exception Handling,Try Catch,在我的对象转换代码中,我有很多: try { NativeObject.Property1= int.Parse(TextObject.Property1); } catch (Exception e) { Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e); } try { NativeObject.Property2= DateTi
try
{
NativeObject.Property1= int.Parse(TextObject.Property1);
}
catch (Exception e)
{
Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e);
}
try
{
NativeObject.Property2= DateTime.Parse(TextObject.Property2);
}
catch (Exception e)
{
Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e);
}
等等。。。我不希望由于某些属性而导致所有转换失败,因此我不能将所有这些都放在一个try块中,但如果某些内容失败,我需要记录并继续。有没有一种方法可以压缩所有这些尝试捕获的内容? 遗憾的是,我们不能用C代码编写如下代码:
try
{
int num = int.Parse("3");
decimal num2 = decimal.Parse("3.4");
}
catch (Exception e)
{
Trace.Write(e);
continue; //continue execution from the point we left. (line 2)
}
不,但你可以:
private static void ExecuteAndCatchException(Action action)
{
try
{
action();
}
catch (Exception e)
{
Trace.Write(e);
}
}
然后
ExecuteAndCatchException(() => NativeObject.Property1 = int.Parse(TextObject.Property1));
ExecuteAndCatchException(() => NativeObject.Property2 = DateTime.Parse(TextObject.Property2));
你可以这样做:
private static void Attempt(Action action)
{
try { action(); }
catch (Exception e) {
Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e);
}
}
然后:
听起来您正在寻找类似于VBs
出错的东西
+下一步继续
。C#没有这样的设施。我能想到的最好的压缩方法是使用lambda表达式和helper方法
private void Wrap(Action del) {
try {
del();
} catch (Exception e) {
Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e);
}
}
Wrap(() => { NativeObject.Property1= int.Parse(TextObject.Property1); });
Wrap(() => { NativeObject.Property2= DateTime.Parse(TextObject.Property2); });
如果可用,您可以使用TryParse方法。请参见下面解析Int32值的示例代码
private static void TryToParse(string value)
{
int number;
bool result = Int32.TryParse(value, out number);
if (result)
{
Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
else
{
if (value == null) value = "";
Console.WriteLine("Attempted conversion of '{0}' failed.", value);
}
}
您可以编写一个SafeConvert类来封装转换和日志记录,如下所示:
public static class SafeConvert{
public static int ParseInt(string val)
{
int retval = default;
try
{
retval = int.Parse(val);
}
catch (Exception e)
{
Trace.WriteLineIf(ConverterSwitch.TraceVerbose, e);
}
return retval;
}
}虽然我不确定异常块的缩短,但我喜欢你提出的想法。这类似于旧VB中的错误恢复。当进行大量的解析时,我会在TryParse可用时使用它。你可以这样说:
If(!DateTime.TryParse(TextObject.Property2, out NativeObject.Property2)) {
// Failed!
}
如果切换到VB.NET,您可以在某个VB6/VBA开发人员对您嗤之以鼻的地方使用下一步错误恢复中的
:-)。没想到我会听到有人渴望“下一步继续犯错”@Cody:噢,天哪。哦,天哪,不。求你了,不。你应该用锥虫来验证你的数据。如果数据有可能是无效的,就应该对其进行验证,异常的效率非常低。异常实际上会导致cpu中断。谈到数千个周期。@Bengie:我同意异常是很慢的,我以后肯定会添加一些验证检查,我现在不想浪费时间在优化上。很遗憾,它实际上不会根据输入错误编译…:P@cdhowie,哎呀,我没有试着编译它,输入错误在哪里?@vc:Action()代码>--此外,该方法实际上应该是静态的,因为从来没有使用过此
。是的,这是正确的方法,假设问题中的示例代码准确地描述了使用这些嵌套的Try-Catch块要完成的任务的范围。在可能的情况下防止异常总是比试图处理它们要好。回答得好+1用于解决实际问题,而不是回答有关解决方法的问题。+1 TryParse是一种更好的方法,如果您想忽略解析错误。@BobBlack:我的实际代码并不像我写的那么简单,因此一般的行动建议对我来说更合适。我自己正要提出这个建议,但你抢先了我一步:)
If(!DateTime.TryParse(TextObject.Property2, out NativeObject.Property2)) {
// Failed!
}