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에 따라 라이센스가 부여됩니다.