none
C# .NET 3.5 Ошибка "необрабатываемое исключение" Почему? RRS feed

  • Вопрос

  • var builder = new StringBuilder(); builder.Append(DiskInformation); try { DriveInfo[] dIDisks = DriveInfo.GetDrives(); foreach (DriveInfo dI in dIDisks) { if (dI.IsReady) { builder.Append($"\t Диск: {dI?.Name}\n\t Формат диска: {dI?.DriveFormat}\n\t Размер диска (ГБ): {Math.Round((double)dI?.TotalSize / 1024 / 1024 / 1024, 2)}\n\t Доступное свободное место (ГБ): {Math.Round((double)dI?.AvailableFreeSpace / 1024 / 1024 / 1024)}\n"); } else { logger.Debug("DriveInfo.IsReady = false Устройство не готово! "); } } } catch (Exception ex) { logger.Debug("SystemInformationCollector :: DriveInfo :: Exception :: {0}", ex.Message); } DiskInformation = builder.ToString();


    https://docs.microsoft.com/it-it/dotnet/api/system.io.driveinfo.getdrives?redirectedfrom=MSDN&view=netframework-3.5#System_IO_DriveInfo_GetDrives

    Ошибка происходит не на всех устройствах. Проверялось на Windows 10/7



    • Изменено PrikhodkoEA 2 октября 2018 г. 10:17
    • Перемещено Vector BCO 2 октября 2018 г. 11:23 перенесено с technet
    2 октября 2018 г. 10:14

Все ответы

  • Покажите вывод Exception.ToString()
    2 октября 2018 г. 11:54
  • Как я могу его показать, если у меня Exception срабатывает как необрабатываемое исключение? 
    2 октября 2018 г. 11:57
  • У вас это "необрабатываемое исключение" как выглядит? Как окно с красным крестом и кучей текста? Если да, то просто покажите этот текст.
    2 октября 2018 г. 12:01
  • Изображение не видно? 

    У меня то вообще все работает, на ряде ПК, которые удаленно,  нет. 

    2 октября 2018 г. 12:02
  • Как я могу его показать, если у меня Exception срабатывает как необрабатываемое исключение? 

    Добавив обработку исключений, конечно.

    Код который вы привели выше ее имеет (хотя и распечатывает исключение неправильно). Однако это судя по всему не тот код в котором происходит исключение. Это видно из фрагмента трассировки на картинке где видно что исключение происходит в некой Ionic.Zip, а ее в приведенном коде не видно.

    Что до собственно причины исключения, то она написана на картинке.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    2 октября 2018 г. 17:01
    Модератор
  • Да, вы правы. 

    Суть в том, сбор информации о системе собирается  потом собранный sting передается в текстовый файл, потом архивируется. 

    Как только я убираю фрагмент кода, который описан выше, ошибка уходит. 

    ....... 

    try { var _SystemInfoFile = tempFolder + "\\SystemInfo.txt"; if (System.IO.File.Exists(_SystemInfoFile)) File.Delete(_SystemInfoFile); var file2 = File.Create(_SystemInfoFile); /// Проинициализируем информацию о системе var initsys = new CommonLib.SystemInformationCollector(); /// Тут идет сбор информации, включая проверку диска string systemInfo = initsys.GetSystemInfo(); var _filename2 = file2.Name; if (systemInfo.Length >0) { using (var writer2 = new StreamWriter(file2)) { writer2.WriteLine(systemInfo); writer2.Close(); } } file2.Close(); } catch (Exception ex) { logger.Debug("CommonLib.SystemInformationCollector() :: Exception :: {0}", ex.Message); }

                try
                {
                    using (ZipFile zip = new ZipFile()) // Создаем объект для работы с архивом
                    {
                        zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestSpeed;
                        zip.AddDirectory(tempFolder);
                        foreach (var item in FilesToSend)
                        {
                            
                            zip.AddFile(item);
                            System.Threading.Thread.Sleep(1000);
                        }
                        System.Threading.Thread.Sleep(1000);
                        zip.Save(dir);
                    }

                }
                catch (Exception ex)
                {

                    logger.Debug("ZipFile :: Exception :: {0}", ex.Message);
                }


    Именно отсюда и вывод, что исключение вызыввает  DriveInfo[] dIDisks = DriveInfo.GetDrives();....
    • Изменено PrikhodkoEA 2 октября 2018 г. 17:20
    2 октября 2018 г. 17:16
  • + у меня вездe TRY вообщем я не могу понять почему try не сработал, почему удалив кусок кода сбор информации дисков позволяет убрать необрабатываемое исключение в другом месте. 

    Как определил, просто исключал код кусками, пока не дошел до этого момента.

    Самое что как мне это людям объяснить, я даже не понимаю. 

    Причем у меня 3 ПК Windows 10 (64) и один Windows 7(X86)! все работает. .... 


    • Изменено PrikhodkoEA 2 октября 2018 г. 18:03
    2 октября 2018 г. 18:02
  • Изображение не отображалось, когда я в первый раз открывал тему. Ну а так, в сообщении написано довольно четко, в чем проблема: файл занят другим процессом. Найдите каким именно (openfiles, Resource Monitor, Process Monitor и т.п.) и все станет ясно. С высокой вероятностью либо ваш собственный зависший процесс, либо антивирус или что-то в этом роде.
    • Изменено VadimTagil 2 октября 2018 г. 18:04
    2 октября 2018 г. 18:04
  • Дальше написал. 

    У меня два вопроса: 

    1. Почему не отработал TRY

    2. Почему убрав фрагмент кода, DriveInfo[] dIDisks =DriveInfo.GetDrives();.... ошибка ушла?!

    2 октября 2018 г. 18:18
  • "Почему не отработал TRY"

    Не знаю. По той информации, которую вы привели, сложно сказать что-то определенное. Например, исключение может возникать в фоновом потоке, который библиотека создает внутри себя, поэтому оно и не попадает в ваши try.

    Строго говоря, не нужно увешивать все блоками try, можно вместо этого установить обработчики AppDomain.UnhandledException и Application.ThreadException.

     "Почему убрав фрагмент кода"

    опять же, пользуясь хрустальным шаром могу предположить, что без этого кода файл SystemInfo.txt получается гораздо меньше размером, поэтому антивирус его проверяет быстрее и вы не натыкаетесь на ошибку. Само по себе получение информации о дисках точно никак не может заблокировать какой-то отдельный текстовый файл.




    2 октября 2018 г. 18:42