使用这样的嵌套Try..Catch块是不是很糟糕?

时间:2009-10-21 16:48:46

标签: c# .net try-catch

这是个坏主意吗?有没有更好的方法来达到同样的效果?

// assume that "name" is a string passed as a parameter to this code block
try
{
    MainsDataContext dx = new MainsDataContext();
    try
    {
        Main m = dx.Main.Single(s => s.Name == name);
        return m.ID;
    }
    catch (InvalidOperationException)
    {
        Guid g = Guid.NewGuid();

        Main s = new Main 
        {
            Name = name,
            ID = g
        };

        dx.Mains.InsertOnSubmit(s);
        dx.SubmitChanges();

        return g;
    }
}
catch (Exception ex)
{
    // handle this
}

此处的目标是获取记录的ID(如果存在),否则创建该记录并返回其ID。

5 个答案:

答案 0 :(得分:6)

你应该使用SingleOrDefault,这样如果一条记录不存在,它将返回该类的默认值为null。

MainsDataContext dx = null;    
try
    {
         dx = new MainsDataContext();

        Main m = dx.Main.SingleOrDefault(s => s.Name == name);

        if ( m == null)
        { 
           Guid g = Guid.NewGuid();

           m = new Main 
          {
              Name = name,
              ID = g
          };

         dx.Mains.InsertOnSubmit(m);
         dx.SubmitChanges();

        }

        return m.ID;
    }
    catch (Exception ex)
    {
        // handle this
    }
    finally
    {
       if(dx != null)
          dx.Dispose();
    }

在使用DataContext时使用使用关键字是个好主意

using ( MainsDataContext dx = new MainsDataContext())
{
        Main m = dx.Main.SingleOrDefault(s => s.Name == name);

        if ( m == null)
        { 
           Guid g = Guid.NewGuid();

           m = new Main 
          {
              Name = name,
              ID = g
          };

         dx.Mains.InsertOnSubmit(m);
         dx.SubmitChanges();

        }

        return m.ID;
}

答案 1 :(得分:6)

Main m = dx.Main.SingleOrDefault(s => s.Name == name);

if (m == default(Main))
{
    // it does not exist
}
else
{
    // it does exist
}

从问题中可以看出类型Main是类还是结构(编辑:我刚才意识到实际上它必须是一个类),因此我使用{ {1}}而不仅仅是与default()进行比较。

答案 2 :(得分:1)

我的问题是你打算在这里放什么代码:

// handle this

使用第一个catch块,您知道Single()抛出了InvalidOperationException,因为序列包含多个元素或为空。

在第二种情况下,您可能会遇到各种错误。空引用,数据访问等。您将如何处理这些?

只捕获您知道如何处理的内容,并尽可能在异常类型中具体说明。

答案 3 :(得分:0)

不,但您可能希望将内部块重新转换为外部方法。

答案 4 :(得分:0)

无论如何,我认为嵌套的Try Catch块很好,就像兄弟Catch块一样,每个块都会遇到不同的问题。有关错误的具体情况很好。全能应该只是生产的安全网。