C\#이상 사용 습득

4527 단어 C#이상 하 다
C\#에서 프로그램 이 실 행 될 때 발생 하 는 오 류 는 프로그램 에서 계속 전 파 됩 니 다.이런 메커니즘 을'이상'이 라 고 합 니 다.이상 은 보통 잘못된 코드 로 인해 발생 하 며,오 류 를 수정 할 수 있 는 코드 로 catch 를 진행 합 니 다.이상 은.NET 의 CLR 또는 프로그램의 코드 에 의 해 발생 할 수 있 습 니 다.이상 이 발생 하면 이 이상 은 호출 스 택 에서 일치 하 는 catch 문 구 를 찾 을 때 까지 계속 위로 전 파 됩 니 다.catch 가 없 는 이상 은 시스템 이 제공 하 는 기본 이상 처리 프로그램 에서 처 리 됩 니 다.즉,디 버 깅 이 중단 되 고 이상 한 정 보 를 표시 하 는 대화 상자 입 니 다.
모든 이상 은 Exception 에서 파생 된 것 이다.이 이상 한 유형 들 은 이상 한 속성 을 상세 하 게 설명 합 니 다.여기 서 나 는 새로운 이상 클래스 를 사용자 정의 할 것 입 니 다.사실 이상 한 속성 을 사용자 정의 할 수도 있 습 니 다.(이것 은 선택 할 수 있 습 니 다)그리고 나 는 throw 키 워드 를 사용 하여 이 대상(즉 이상)을 표시 합 니 다.

/// <summary>
  ///      
  /// </summary>
  class MyException : Exception
  {
   public MyException(string msg) { }
  }
  /// <summary>
  ///         
  /// </summary>
  static void ThrowMyExcetion()
  {
   throw new MyException("Sorry, this is test!");
  }
이상 을 일 으 킨 후,실행 할 때 프로그램 은 현재 문장 이 try 블록 에 포함 되 어 있 는 지 확인 합 니 다.그렇다면 이 try 블록 과 연 결 된 모든 catch 블록 을 검사 하여 catch 가 이상 할 수 있 는 지 확인 합 니 다.  catch 블록 은 보통 이상 유형 을 지정 합 니 다.이 catch 블록 의 유형 이 이상 하거나 기본 클래스 와 같 거나 일치 하면 이 catch 블록 을 캡 처 하고 처리 할 수 있 습 니 다.

static void Main(string[] args)
  {
   try
   {
    ThrowMyExcetion(); //           
   }
   catch (MyException e)
   {
    Console.WriteLine(e);
   }
   Console.Read();
  }

이상 을 일 으 키 는 문 구 는 try 블록 에 없 거나 이 문 구 를 포함 하 는 try 블록 에 일치 하 는 catch 블록 이 없 으 면 호출 방법 에 try 구문 과 catch 블록 이 있 는 지 확인 합 니 다.실행 시 호출 스 택 에서 호 환(또는 일치)된 catch 블록 을 계속 위로 검색 합 니 다.catch 블록 을 찾 아 실행 하면 제어 권 은 catch 블록 다음 문장 에 전 달 됩 니 다.
하나의 try 문 구 는 여러 개의 catch 블록 을 포함 할 수 있 습 니 다.이 이상 한 catch 문 구 를 처리 할 수 있 는 첫 번 째 문 구 를 실행 합 니 다.호 환 되 더 라 도 후속 catch 문 구 는 무시 된다.따라서 어떤 경우 에 도 가장 구체 적(또는 파생 정도 가 가장 높 음)에서 가장 구체 적 이지 않 은 순서 로 catch 블록 을 배열 해 야 한다.예 를 들 면:

static void Main(string[] args)
  {
   StreamWriter sw = null;
   try
   {
    sw = new StreamWriter(@"C:\book\        .txt");
    sw.Write("You are 250.");
   }
   catch (FileNotFoundException e)
   {
    //           
    Console.WriteLine(e);
   }
   catch (IOException e)
   {
    //               
    Console.WriteLine(e);
   }
   catch (Exception e)
   {
    Console.WriteLine(e);
   }
   finally
   {
    if (sw != null)
    {
     sw.Close();
    }
   }
   Console.Read();
  }
catch 블록 을 실행 하기 전에 실행 할 때 finally 블록 을 검사 합 니 다.Finally 블록 은 프로그래머 가 중 단 된 try 블록 이 남 겨 놓 은 모호 한 상 태 를 제거 하거나 외부 자원(예 를 들 어 그래 픽 핸들,데이터 베이스 연결 또는 파일 흐름)을 방출 할 수 있 도록 합 니 다.실행 중인 쓰레기 회수 기 가 이 대상 을 종료 할 때 까지 기다 리 지 않 아 도 됩 니 다.예 를 들 면:

static void Main(string[] args)
  {
   FileStream fs = null;
   FileInfo fi = new FileInfo(@"        .txt");
   try
   {
    fs = fi.OpenWrite();
    fs.WriteByte(0);
   }
   finally
   {
    //   ,      close,     IO   !
    //if (fs != null)
    //{
    // fs.Close();
    //}
   }
   try
   {
    fs = fi.OpenWrite();
    fs.WriteByte(1);
    Console.WriteLine("OK!");
   }
   catch (IOException e)
   {
    Console.WriteLine("Fail!");
   }
   Console.Read();
  }

“Fail!”,파일 흐름 을 닫 아야 한 다 는 설명 이 있 기 때 문 입 니 다.설명 을 없 애고 결 과 를 보 세 요.기억 하 세 요.IO 작업 이 끝 날 때 자원 을 방출 해 야 합 니 다. 
WriteByte(0)(9 줄)에 이상 이 생기 면 fs.Close()를 호출 하지 않 은 상태 에서 두 번 째 try 블록 에서 Write()코드 를 다시 열 려 고 시도 하 는 데 실패 합 니 다.이 때 파일 이 잠 겨 있 기 때 문 입 니 다.설명 을 취소 하면 finally 블록(이상 이 발생 하 더 라 도)을 실행 하기 때문에 파일 을 정확하게 닫 아서 다시 이상 이 발생 하지 않도록 할 수 있 습 니 다.
이상 을 일 으 킨 후 호출 스 택 에서 일치 하 는 catch 블록 을 찾 지 못 하면 다음 과 같은 상황 이 발생 할 수 있 습 니 다.
4.567917.석조 함수 에 이상 이 나타 나 면 이 석조 함 수 를 중단 하고 기본 클래스 의 석조 함수(있 으 면)를 호출 합 니 다
  • 스 택 에 정적 구조 함수 나 정적 필드 의 초기 값 설정 항목 을 포함 하면 TypeInitializationException 을 일 으 키 고 원본 이상 을 새로운 이상 한 InnerException 속성 에 배분 합 니 다
  • 4.567917.스 레 드 의 시작 에 도착 하면 스 레 드 가 종 료 됩 니 다.
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기