C#예외 처리 시작

12028 단어 .NET
간단하게 말하자면 라인 문제와 관련이 없는 이상 처리는 아래의 몇 가지 부분을 포함한다.
이상과 이상류의 소개
try catch finally thorw 키워드
try 중첩
catch 블록의 순서
사용자 정의 예외 클래스
아무리 훌륭한 프로그램이라도 제어할 수 있거나 제어할 수 없는 여러 가지 원인으로 인해 코드에서 이상이 발생한다. 예를 들어 제수가 0이면 존재하지 않는 파일을 열고 네트워크가 끊기는 등 예측할 수 없는 이상이 발생한다.이것은 이상 처리 메커니즘에 사용해야 한다.
어떤 이상이 발생하면 프로그램은 이상한 정보를 포함하는 Exception 클래스의 하위 클래스 대상을 던집니다.
이 그림은 C# 디자인에서 부분적으로 정의된 클래스의 계승 관계를 보여 준다.
여기서 SystemException은 런타임 예외입니다. ApplicationException은 제3자 사용자 정의 클래스에 사용됩니다. 만약에 우리가 사용자 정의 클래스를 정의하기를 원한다면 이 클래스를 계승할 수 있습니다.
다음은 또 한 장의 표를 제시하여 흔히 볼 수 있는 이상류를 열거한다
이상 클래스 이름에 대한 간단한 설명
MemberAccessException 접근 오류: 유형 구성원이 ArgumentException 매개 변수에 접근할 수 없음 오류: 메소드의 매개 변수가 올바르지 않음ArgumentNullException 매개 변수가 비어있음: 메소드에 사용할 수 없는 빈 매개 변수를 전달하는 메소드ArithmeticException 수학 계산 오류:수학 연산으로 인한 이상은 범위가 넓다.ArrayTypeMismatchException 배열 유형이 일치하지 않음DivideByZeroExceptionFormatException 매개 변수의 형식이 올바르지 않음0보다 작거나 마지막 요소의 인덱스보다 큰 InvalidCastException 불법 강제 변환명시적 전환 실패 시 Multicast NotSupported Exception이 지원하지 않는 그룹 방송: 두 개의 비공위 파견이 실패할 때 NotSupported Exception 호출을 일으키는 방법은 클래스에서 Null Reference Exception이 빈 인용 대상을 인용하지 않았을 때 Out OfMemory Exception이 새 문장에 메모리를 분배하지 못할 때 발생합니다.메모리 부족 Overflow Exception 넘침 Stack Overflow Exception 스택 넘침 Type Initialization Exception 오류의 초기화 형식: 정적 구조 함수에 문제가 있을 때 NotFinite Number Exception 무한대 값: 숫자가 합법적이지 않습니다
이렇게 많이 썼는데 어떻게 디자인하고 사용하는지 기본적인 포맷은요.
try
{
    //..............
}
catch
{
    //...............
}
finally
{
    //...............
}

try 블록 부분에 이상한 코드를 던질 수 있습니다
catch 블록 쓰기 이상 후 처리 방법
finally는 이상이 있든 없든 실행하는 코드를 씁니다. (보통 자원을 방출하는 코드들입니다.) finally 블록은 생략할 수 있습니다.
코드를 구체적으로 봐요.
   1:          static void Main(string[] args)
   2:          {
   3:              int n1 = 10;
   4:              int n2 = 0;
   5:              int result;
   6:              try
   7:              {
   8:                  result = n1 / n2;
   9:                  Console.WriteLine("{0}", result);
  10:              }
  11:              catch (DivideByZeroException e)
  12:              {
  13:                  Console.WriteLine(e.Message);
  14:              }
  15:              catch (Exception e)
  16:              {
  17:                  Console.WriteLine(e.Message);
  18:              }
  19:              finally
  20:              {
  21:                  Console.WriteLine("finally");
  22:              }
  23:              Console.ReadKey();
  24:          }

출력 결과
하나의try 블록은 여러 개의catch 블록에 대응할 수 있습니다. 그 중에서 버려진 이상 클래스에 따라 대응하는catch 블록을 찾을 수도 있고, 찾을 수 없을 수도 있습니다. 찾지 못하면 프로그램을 종료하고 오류 코드를 되돌려줍니다.
그러나 주의해야 할 모든catch 블록 사이에는 순서가 있습니다. 하위 클래스는 부모 클래스 앞에 써야 합니다. 그렇지 않으면 컴파일할 수 없습니다.
또한 이상 처리는 서로 끼워 넣을 수 있어 내부에서 대응하는 처리 코드를 찾지 못하면 바깥쪽으로 찾을 수 있다.
그리고 MSDN이라는 표현이 있어요."많은 경우 이상은 코드가 직접 호출하는 방법이 아니라 호출된 창고의 위치가 더 밑에 있는 다른 방법으로 발생할 수 있습니다. 이 경우 CLR은 창고를 펼쳐서 특정한 이상 유형에 대한catch 블록을 포함하는 방법이 있는지 찾습니다. 이런 방법을 찾으면 첫 번째 이런catch 블록을 찾습니다. 호출된 창고의 어떤 위치에서도 찾을 수 없습니다.적당한catch 블록은 프로세스를 종료하고 사용자에게 메시지를 표시합니다.
아래의 코드를 구체적으로 보아라
   1:          static void Main(string[] args)
   2:          {
   3:              int n1 = 10;
   4:              int n2 = 0;
   5:              int result;
   6:              try
   7:              {
   8:                  try
   9:                  {
  10:                      result = n1 / n2;
  11:                      Console.WriteLine("{0}", result);
  12:                  }
  13:                  catch (MemberAccessException e)
  14:                  {
  15:                      Console.WriteLine(e.Message);
  16:                  }
  17:                  finally
  18:                  {
  19:                      Console.WriteLine("finally1");
  20:                  }
  21:              }
  22:              catch (Exception e)
  23:              {
  24:                  Console.WriteLine(e.Message);
  25:              }
  26:              finally
  27:              {
  28:                  Console.WriteLine("finally2");
  29:              }
  30:              Console.ReadKey();
  31:          }

결과 내보내기
마지막으로 우리는 throw 문장으로 수동으로 이상 클래스를 던질 수 있고, 어떻게 이상 클래스를 사용자 정의할 수 있는지 설명할 수 있다.
다음 코드는 더블 나눗셈 시 나눗셈 검사를 실현했고 나눗셈이 0일 때 이상을 던졌습니다.C#Double을 0으로 나누면 이상이 아닌 무한대로 되돌아옵니다.
구체적으로 더블 정의의 Positive Infinity와 IsPositive Infinity를 볼 수 있습니다.
   1:          private class TestException : ApplicationException
   2:          {
   3:              public string msg;
   4:              public TestException(string msg)
   5:              {
   6:                  this.msg = msg;
   7:              }
   8:          }
   9:          static double mul(double n1, double n2)
  10:          {
  11:              if (n2 == 0.0)
  12:              {
  13:                  throw new TestException("   0");
  14:              }
  15:   
  16:              return n1 / n2;
  17:          }
  18:          static void Main(string[] args)
  19:          {
  20:              double n1 = 10.0;
  21:              double n2 = 0.0;
  22:              double result;
  23:              try
  24:              {
  25:                  result = mul(n1, n2);
  26:                  Console.WriteLine(result);
  27:              }
  28:              catch (TestException e)
  29:              {
  30:                  Console.WriteLine(e.msg);
  31:              }
  32:              Console.ReadKey();
  33:          }
  34:          
  35:      }

결과 내보내기
제수는 0이다
관련 기사
http://www.microsoft.com/China/Community/program/originalarticles/TechDoc/errorhandling.mspx
http://www.legalsoft.com.cn/docs/573.html
http://msdn.microsoft.com/zh-cn/library/system.exception.aspx?appId=Dev10IDEF1&l=ZH-CN&k=k%28EHINVALIDOPERATION%29;k%28TargetFrameworkMoniker-
http://msdn.microsoft.com/zh-cn/library/ms173160.aspx
http://msdn.microsoft.com/zh-cn/library/ms173162.aspx
http://msdn.microsoft.com/zh-cn/library/ms173163.aspx

좋은 웹페이지 즐겨찾기