중첩 시도를 사용하는 것이 좋지 않습니까 .. 이와 같은 캐치 블록?
문제
이것이 나쁜 생각입니까? 동일한 효과를 달성하는 더 좋은 방법이 있습니까?
// 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를 사용해야합니다. 예를 들어 레코드가 존재하지 않으면 클래스의 기본값을 반환합니다.
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;
}
다른 팁
Main m = dx.Main.SingleOrDefault(s => s.Name == name);
if (m == default(Main))
{
// it does not exist
}
else
{
// it does exist
}
유형이 (편집 : 방금 수업이어야한다는 것을 깨달았습니다) 따라서 사용했습니다. Main
클래스 또는 구조물입니다default()
그냥 비교하는 대신 null
.
내 질문은 여기에 어떤 코드를 두려고하는지입니다.
// handle this
첫 번째 캐치 블록을 사용하면 시퀀스에 하나 이상의 요소가 포함되거나 비어 있기 때문에 Single ()가 InvalidoperationException을 던 졌다는 것을 알고 있습니다.
두 번째로, 당신은 모든 종류의 오류를 얻을 수 있습니다. NULL 참조, 데이터 액세스 등. 어떻게 처리 하시겠습니까?
처리 방법을 알고있는 것만 잡고 가능한 한 예외 유형에서 구체적으로하십시오.
어쨌든, 나는 중첩 된 시도 캐치 블록이 각각 다른 문제를 잡는 형제 캐치 블록과 같이 좋다고 생각합니다. 오류에 대해 구체적으로하는 것이 좋습니다. 어획량은 생산을위한 안전망 일뿐입니다.
아니요,하지만 내부 블록을 외부 방법으로 피할 수 있습니다.
제휴하지 않습니다 StackOverflow