중첩 시도를 사용하는 것이 좋지 않습니까 .. 이와 같은 캐치 블록?

StackOverflow https://stackoverflow.com/questions/1602102

  •  05-07-2019
  •  | 
  •  

문제

이것이 나쁜 생각입니까? 동일한 효과를 달성하는 더 좋은 방법이 있습니까?

// 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 참조, 데이터 액세스 등. 어떻게 처리 하시겠습니까?

처리 방법을 알고있는 것만 잡고 가능한 한 예외 유형에서 구체적으로하십시오.

어쨌든, 나는 중첩 된 시도 캐치 블록이 각각 다른 문제를 잡는 형제 캐치 블록과 같이 좋다고 생각합니다. 오류에 대해 구체적으로하는 것이 좋습니다. 어획량은 생산을위한 안전망 일뿐입니다.

아니요,하지만 내부 블록을 외부 방법으로 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top