c# - 像这样使用嵌套的 Try..Catch block 不好吗?

标签 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。

最佳答案

您应该使用 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 关键字是个好主意

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

关于c# - 像这样使用嵌套的 Try..Catch block 不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1602102/

相关文章:

PHP(或其他): Strategy to deal with exceptions that "cannot occur"

c# - 文化信息和日期时间信息 : How to check if is 24 hour time?

c# - C#中的两种不同的窗体

.net - 如何在 Protobuf.Net 中映射系统枚举

c# - 添加到通用字典会导致 IndexOutOfRangeException

javascript - javascript try...catch 语句是如何工作的

c - C语言有Try和Catch吗?

c# - 具有 OWIN 集成的 Autofac 调用了错误的构造函数

c# - 具有异常处理的方法参数

c# - 在 .Net 中构建 Web 服务的首选方法是什么?