Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中处理异常时,如何压缩大量小的Try-Catch块?_C#_.net_Exception_Exception Handling_Try Catch - Fatal编程技术网

在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!
}