2015-10-15 9 views
-3

У меня есть следующий код.Обработка исключений?

using System; 
using System.IO;       

class ExceptionHandling 
{ 
    public static void Main() 
    { 
     StreamReader streamReader = null; 
     try 
     { 
     streamReader = new StreamReader("C:\\Sample Files\\Data.txt");  
     Console.WriteLine(streamReader.ReadToEnd());        
     } 

     catch(FileNotFoundException ex)           
     {  
      Console.WriteLine("Please check if the file {0} exists",ex.FileName); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      if (streamReader !=null)     
      { 
      streamReader.Close(); 
      } 
      Console.WriteLine("FInally Block"); 
     } 
    } 
} 

Мои вопросы заключаются в следующем:

1) В StreamReader streamReader = null; почему назначается StreamReader к нулю?

2) streamReader = new StreamReader Я просто хочу это разъяснить. Является ли ссылочная переменная streamReader указателем на объект StreamReader?

3) Если исключение происходит в streamReader = new StreamReader("C:\\Sample Files\\Data.txt");, продолжает ли streamReader открываться?

4) Поскольку мы написали StreamReader streamReader = null;, это не streamReader всегда null, и поэтому невозможно закрыть в блоке finally?

5) Я не уверен, как FileNotFoundException ex и Exception ex работы. Не является ли эталонная переменная объекта и работает ли она только после того, как мы назначим их объекту, например Exception ex = new Exception?

+7

Слишком много вопросов. Чтение документации и хорошее начало C# book - это то, где вы должны начать. –

ответ

3
  1. Это утверждение означает, что в дальнейшем, если вы хотите, чтобы проверить, что StreamReader правильно открыт вы можете сделать streamReader == null

  2. Это создает новый экземпляр объекта StreamReader с пути.

  3. No streamReader не будет открыт и будет выбрано исключение.

  4. В блоке finally это будет выполняться, если возникает исключение, а также если это не так. Поэтому важно распоряжаться любыми выделенными системными ресурсами.

  5. FileNotFound бросается при открытии streamReader, однако исключение ex является общим случаем для любого другого исключения.

Некоторые общие сведения об streamReader это класс, который наследуется от объекта System.IO.Stream (имеет схожие свойства). Он выделяет системные ресурсы для создания экземпляра и декларирует себя как чтение определенного потока (в этом случае поток событий). Поэтому, если вы создаете экземпляр streamReader, вам НЕОБХОДИМО закрыть его, чтобы другие приложения могли получить доступ к ресурсу.

Причина, по которой он не позволяет другим приложениям читать этот ресурс, чтобы предотвратить возникновение проблем с несколькими потоками, то есть одно приложение читает документ, программист предполагает, что документ не изменяется между тем, когда их программа открывает документ и когда они закрываются Это. Если появляется другая программа и изменяет какой-либо текст в файле, исходная программа может потерпеть крах и привести к BSOD.

+0

Как вы сказали, если streamReader не откроется, и будет исключено исключение, почему мы должны закрыть его в блоке finally? – jelly

+2

Если исключение не выбрасывается, вам все равно нужно избавиться от streamReader – Cjen1

+0

Cjen 1 Большое вам спасибо. Я учился с учебниками, поэтому не было никакой информации об утилизации streamReader и ресурсов и т. Д. Не могли бы вы рассказать мне, что они собой представляют. – jelly

2
  1. Это просто инициализирует переменную streamReader в null. Если вы не инициализировали значение, вы получите ошибки компилятора об использовании неинициализированной переменной в блоке fianally.

  2. Да.

  3. Нет. Но есть шанс, что конструктор StreamReader будет успешным, но вызов streamReader.ReadToEnd() вызовет исключение. В этом случае у вас будет открытый streamReader.

  4. Нет, см. Приведенный выше ответ.

  5. Различные блоки catch позволяют обрабатывать различные типы ошибок. Только один блок catch будет обрабатывать любое данное исключение. C# определит наиболее специфическое исключение, которое вы обрабатываете, и убедитесь, что вы ввели этот блок. Фактический экземпляр Exception (ex) будет сконструирован и передан блоку Framework. Вам не нужно ничего делать явным.

+0

Большое спасибо за ответ. Это было действительно полезно, но в вашем ответе 3 можно было бы объяснить, когда конструктор StreamReader будет успешным, но вызов streamReader.ReadToEnd() вызовет исключение? – jelly

+0

@jelly - Если вы посмотрите на документацию для метода, есть раздел «Исключения», в котором указано, какие именно исключения могут быть выбраны методом метода: https://msdn.microsoft.com/en-us /library/system.io.streamreader.readtoend(v=vs.110).aspx –

Смежные вопросы