Arhn - архитектура программирования

Как управлять исключением в блоке catch С#?

У меня есть следующий код.

try
{
    int s=10;
    int k=0;
    int stdsd = s / k;
}
catch (DivideByZeroException ext)
{
    FileStream fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);  
    //encountered an exception as file doesn't exist.
}
catch (Exception ex)
{
}
finally
{
    //some code here.
}

В приведенном выше коде, когда возникает исключение, он попытается записать это в один файл в блоке catch. Но когда он попытается открыть этот файл, этот файл не существует, поэтому в таких случаях происходит сбой системы. Я хочу выполнить такой критический код в блоке finally, но из-за исключения в блоке catch он не идет дальше этой строки.

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

01.09.2015

  • Хорошая практика программирования - у вас должен быть специальный метод/класс для выполнения всех операций, связанных с журналом. кстати, не проверяйте, существует ли файл перед записью в него, это плохой дизайн программирования, так как может быть сценарий, когда файл удаляется между вызовом File.Exists и вызовом File.Write 01.09.2015
  • Почему бы не инкапсулировать открытие файла в блоке try catch? 01.09.2015

Ответы:


1

Вы не можете обработать исключение, сгенерированное из одного блока catch в блоке catch, связанном с тем же оператором try/catch. Вместо этого вам нужен дополнительный:

catch (DivideByZeroException ext)
{
    try
    {
        FileStream fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);  
    }
    catch (IOException e)
    {
        // Handle the exception here
    }
}

Обратите внимание, что вы должны использовать оператор using при открытии потока, так что вы закроете его автоматически, независимо от того, возникнет ли позже исключение.

Я бы также рекомендовал не размещать подобный код непосредственно в блоке catch — обычно блоки catch должны быть короткими для удобочитаемости. Рассмотрите возможность переноса всех функций обработки ошибок в отдельный метод (или, возможно, даже в отдельный класс).

01.09.2015

2

Просто используйте другой try {} catch {} ...

try { 
    // ...
    try {
        // try opening your file here ...
    } catch (Exception) {
        // ...
    }
} catch (Exception) {
    // ...
}
01.09.2015

3

Если вы не хотите проверять наличие файла «здесь» (в исключении), вы можете альтернативно проверить существование «там», то есть: ранее в коде.

Что вы хотите сделать, так это записать журнал исключений в файл, насколько я понимаю. Таким образом, вы можете настроить правильную обработку файла журнала ранее в коде, в лучшем случае с хорошим обработчиком файла журнала. После этого единственное, что вам нужно сделать в обработчике исключений, это отправить сообщение об исключении в обработчик журнала, который затем правильно запишет эту информацию в файл.

01.09.2015

4

исключения - это очень сильное будущее любого языка, которое нельзя игнорировать в большинстве случаев, но по возможности старайтесь его избегать

Посмотри на это

            String File = "File.txt";
            System.IO.FileInfo fileinfo = new System.IO.FileInfo(File);

           if(fileinfo.Exists)
           {
               using (System.IO.FileStream file = new System.IO.FileStream(File, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
             {
                 // operation on file here
             }
           }else
           {
               using (System.IO.FileStream file = new System.IO.FileStream(File, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
               {
                   // operation on file here now the file is new file 
               }
           } 
01.09.2015
  • Что, если файл будет удален (или создан) сразу после проверки fileinfo.Exists? Что, если он существует, но заблокирован или доступен только для чтения? Трудно избежать обработки исключений, когда вы имеете дело с файловой системой. 01.09.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..