这是个坏主意吗?有没有更好的方法来达到同样的效果?
// 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。
答案 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
}
从问题中可以看出类型(编辑:我刚才意识到实际上它必须是一个类),因此我使用{ {1}}而不仅仅是与Main
是类还是结构default()
进行比较。
答案 2 :(得分:1)
我的问题是你打算在这里放什么代码:
// handle this
使用第一个catch块,您知道Single()抛出了InvalidOperationException,因为序列包含多个元素或为空。
在第二种情况下,您可能会遇到各种错误。空引用,数据访问等。您将如何处理这些?
只捕获您知道如何处理的内容,并尽可能在异常类型中具体说明。
答案 3 :(得分:0)
不,但您可能希望将内部块重新转换为外部方法。
答案 4 :(得分:0)
无论如何,我认为嵌套的Try Catch块很好,就像兄弟Catch块一样,每个块都会遇到不同的问题。有关错误的具体情况很好。全能应该只是生产的安全网。