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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다. 아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다. 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.