Игнорировать исключение в определенном месте при отладке? - PullRequest
0 голосов
/ 18 января 2019

Наше приложение перемещает некоторые файлы, необходимые для запуска во время запуска.

Приложение заботится (при выключении), чтобы правильно остановить каждый процесс, использующий эти файлы.

Однако, если приложение вылетает / или вы просто нажимаете «stop» в VS при отладке - некоторые исполняемые файлы могут все еще работать.

Таким образом, если вы быстро перезапустите приложение, может произойти сбой попытки копирования из-за того, что файл все еще используется.

В этом случае мы просто игнорируем неудачную попытку копирования - или, точнее, неудачную попытку удаления, которая должна гарантировать, что доступна последняя версия:

foreach(String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try
        {
            System.IO.File.Delete(entry);
        }catch (Exception e)
        {
            //ignore during this startup.
        }
    }
}

Теперь это прекрасно работает, так как существует версия файла, доступная для использования, а рабочая версия просто игнорирует исключение.

Досадная проблема в том, что отладчик «ломается» каждый раз, когда возникает эта ошибка.

  • Мы не хотим вообще "игнорировать" любые System.IO.IOException, брошенные во время отладки.
  • Мы попытались аннотировать метод в вопросе с помощью [System.Diagnostics.DebuggerStepThrough()], который работает, но вызывает исключение, которое будет перехвачено в позиции вызывающих.

Итак, есть ли способ игнорировать "некоторые" исключения, возникающие в определенной строке кода, даже если включен общий "взлом" для такого рода?

Некоторые #if (DEBUG) -Директивы, которые позволят избежать исключения для этой конкретной строки кода?

Что-то вроде:

foreach(String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try
        {
#if (DEBUG:NoThrow)
            System.IO.File.Delete(entry);
#endif
        }catch (Exception e)
        {
            //ignore during this startup.
        }
    }
}

1 Ответ

0 голосов
/ 19 января 2019

Я все еще заинтересован в ответе, потому что у него "много" вариантов использования.

На данный момент мы использовали следующий «обходной путь»: Проверьте, был ли доступ к файлу в течение 3 минут - затем не пытайтесь удалить его. (Для режима отладки!)

Помните, что проблема заключается только в «отладчике», а не в работе, где исключения могут быть легко обнаружены (и проигнорированы) для определенной строки кода.

Мы просто хотим избежать появления «Отладочных перерывов», если исключение можно игнорировать в ЭТОЙ строке кода.

foreach (String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try {
#if (DEBUG)
            FileInfo fi = new FileInfo(entry);
            if (fi.LastAccessTime < DateTime.Now.AddMinutes(-3))
            {
#endif
                System.IO.File.Delete(entry);
#if (DEBUG)
            }
#endif
        }
        catch (Exception e)
        {
            //ignore
        }
    }
}

Это НЕ решение, это обходной путь, сокращающий количество отладочных разрывов в этой строке кода примерно на 99%, если вы просто «остановите» отладку в Visual Studio!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...