книги и литература по Exception
От: Аноним  
Дата: 08.02.11 02:11
Оценка:
добрый день. Замечаю за собой, что не умею правильно обрабатывать эксепшины. Где можно наглядно про это почитать и вообще как правильно их обрабатывать?
Re: книги и литература по Exception
От: Sinix  
Дата: 08.02.11 04:15
Оценка: +4 -1
Здравствуйте, Аноним, Вы писали:

А>добрый день. Замечаю за собой, что не умею правильно обрабатывать эксепшины. Где можно наглядно про это почитать и вообще как правильно их обрабатывать?


Если коротко: ловите только _ожидаемые_ исключения, на которые вы знаете, как реагировать. Откат — внутри finally, всё остальное — на откуп unhandled exception handler.

Обработчик должен логировать исключение и (скорее всего) дать приложению тихо-мирно сдохнуть. Исключение — операции, которые можно безопасно отменить (весь код — stateless, или каждое изменение состояния автоматом откатывается в случае ошибки).

Чуть-чуть обсуждалось в рамках холивара
Автор: Sinix
Дата: 24.12.10
.

В шарпе исключения означают или ошибку в логике программы, или проблемы с внешним ресурсом, или незнание документации. На большой проект общих компонент у меня отлавливаются:
— InvalidOperationException — для отлова Expression.MakeBinary для типов без соответствующих операторов.
— ArgumentException — для отлова ошибки разбора текстовых команд (опционально — rethrow)
— OperationCanceledException — для отлова отмены Parallel.ForEach
— SqlException — для проверки соединения и получения enum-а с причиной ошибки.
— IOException — для проверки, не заняты ли приложением файл/папка и
— IOException — для отлова "фичи" explorer-а, не закрывающего хендл удаляемой папки — Thread.Yield() + ещё одна попытка удалить (на этот раз без catch).

Несколько особняком стоит AppSingleton, использующий named pipe для проверки единственности процесса/передачи параметров командной строки уже запущенному процессу. Там отлавливаются UnauthorizedAccessException, IOException, TimeoutException и EndOfStreamException.

Если не считать Expression.MakeBinary и Parallel.ForEach, всё остальное — отлов граблей с внешними ресурсами.

Поэтому не надо путать публичный контракт метода — его нарушение отлавливаться вообще не должно — и сообщения вида "фигня случилась!". Обрабатывать надо только последние, и то, если мы либо знаем причины этой фигни, либо сами являемся причиной.


Читать — в первую очередь — framework design guidelines. Также более-менее подробно расписано тут:
http://msdn.microsoft.com/en-us/library/ms229014.aspx
http://bellouti.wordpress.com/2009/08/28/guidelines-for-consistent-exception-and-error-handling/
Re[2]: книги и литература по Exception
От: Sinix  
Дата: 08.02.11 05:24
Оценка:
Undying, а поцеловать обосновать? С чем несогласны?
Re: книги и литература по Exception
От: matumba  
Дата: 08.02.11 06:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Замечаю за собой, что не умею правильно обрабатывать эксепшины.


Для того, чтобы говорить "неправильно", уже нужно знать как "правильно". Значит, вы уже знаете ответ?

А>Где можно наглядно про это почитать и вообще как правильно их обрабатывать?


Практически в любой книге по дотнету/цэшарпу даётся вразумительный и практически единственный пример. Что там сложного? Или вот ещё:
"Как отлавливались иксепшыны", CatchTrowskiy.
"Горе от иксепшына" — изд.в 3 т. с иллюстрациями.
Re[3]: книги и литература по Exception
От: _FRED_ Черногория
Дата: 08.02.11 06:27
Оценка: -1 :)
Здравствуйте, Sinix, Вы писали:

S>Undying, а поцеловать обосновать? С чем несогласны?


Бросьте, это бесполезно. Человек давно и упорно возражает по данному (и не только) поводу, но обсуждать с ним что-либо совершенно не стоит, ибо ни разу чего-нибудь интересного или нового сказано небыло. Пускай спокойно добывает свой эфир и пользуется торсионными полями на зло прогрессивному человечеству.
Help will always be given at Hogwarts to those who ask for it.
добывает
Re: книги и литература по Exception
От: _FRED_ Черногория
Дата: 08.02.11 06:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>добрый день. Замечаю за собой, что не умею правильно обрабатывать эксепшины. Где можно наглядно про это почитать и вообще как правильно их обрабатывать?


Тут
Автор: _FRED_
Дата: 26.01.09
есть несколько ссылок на статьи.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: книги и литература по Exception
От: Undying Россия  
Дата: 08.02.11 06:48
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Undying, а поцеловать обосновать? С чем несогласны?


С выделенным:

Если коротко: ловите только _ожидаемые_ исключения, на которые вы знаете, как реагировать.


Но это уже не раз обсуждалось на форуме, поэтому повторяться смысла нет.
Re[4]: книги и литература по Exception
От: Sinix  
Дата: 08.02.11 07:25
Оценка: 5 (1)
Здравствуйте, Undying, Вы писали:

Если коротко: ловите только _ожидаемые_ исключения, на которые вы знаете, как реагировать.

U>Но это уже не раз обсуждалось на форуме, поэтому повторяться смысла нет.

Если не хотите обсуждать — приведите хоть ссылку. Никто не будет угадывать, что именно вы имели в виду.

Если вы поймали внезапное исключение — что вы будете делать с ним дальше?
Если вы пытаетесь использовать catch для отката — вам привет от corrupted state exceptions (ещё можно почитать http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx).
Re[5]: книги и литература по Exception
От: Undying Россия  
Дата: 08.02.11 10:59
Оценка: 16 (1)
Здравствуйте, Sinix, Вы писали:

S>Если не хотите обсуждать — приведите хоть ссылку. Никто не будет угадывать, что именно вы имели в виду.


Во-первых, нельзя ли сменить тон на более вежливый?
Во-вторых, к примеру, смотрите http://rsdn.ru/forum/dotnet/3228446.1.aspx
Автор: Undying
Дата: 25.12.08
и http://rsdn.ru/forum/dotnet/3187458.1.aspx
Автор: Undying
Дата: 25.11.08
и обсуждение этих постов.

S>Если вы поймали внезапное исключение — что вы будете делать с ним дальше?


Первая ссылка отвечает на этот вопрос.

S>Если вы пытаетесь использовать catch для отката — вам привет от corrupted state exceptions (ещё можно почитать http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx).


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

Во-вторых, посмотрим на список таких исключений:

EXCEPTION_ACCESS_VIOLATION EXCEPTION_STACK_OVERFLOW
EXCEPTION_ILLEGAL_INSTRUCTION EXCEPTION_IN_PAGE_ERROR
EXCEPTION_INVALID_DISPOSITION EXCEPTION_NONCONTINUABLE_EXCEPTION
EXCEPTION_PRIV_INSTRUCTION STATUS_UNWIND_CONSOLIDATE.

EXCEPTION_STACK_OVERFLOW сразу исключаем из рассмотрения, т.к. это исключение никогда в дотнете не обрабатывалось. Остальные исключения же, во-первых, достаточно экзотические, т.е. вероятность их возникновения либо мала, либо очень мала, во-вторых, не понятно какова вероятность того, что эти исключения приведут к реальным проблемам. Скажем с access_violation я стакивался относительно часто, но ни разу не видел, чтобы его обработка приводила к каким-то проблемам.

В-третьих, что-то мне подсказывает, что ущерб нанесенный пользователям по причине обработки этих видов исключений в catch(Exception ex) в миллион раз меньше ущерба нанесенного пользователям падениями программ, не умеющих обрабатывать ошибки не предусмотренные программистом.
Re[6]: книги и литература по Exception
От: Sinix  
Дата: 08.02.11 11:11
Оценка: +1
Здравствуйте, Undying, Вы писали:
икто не будет угадывать, что именно вы имели в виду.

U>Во-первых, нельзя ли сменить тон на более вежливый?

Ок. Перечитал — получилось несколько резче, чем хотел. Точку зрения понял, спорить не будем
Re[2]: книги и литература по Exception
От: Аноним  
Дата: 09.02.11 14:35
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Если коротко: ловите только _ожидаемые_ исключения, на которые вы знаете, как реагировать. Откат — внутри finally, всё остальное — на откуп unhandled exception handler.


т.е. откат внутри finally? Finally я так понимаю выполнится в любом случае, успешным или нет был блок try? Может откат всё же в блоке catch?
что значит "на откуп unhandled exception handler"?


S>Обработчик должен логировать исключение и (скорее всего) дать приложению тихо-мирно сдохнуть. Исключение — операции, которые можно безопасно отменить (весь код — stateless, или каждое изменение состояния автоматом откатывается в случае ошибки).


что значит "код stateless"?

S>Чуть-чуть обсуждалось в рамках холивара
Автор: Sinix
Дата: 24.12.10
.

S>

S>В шарпе исключения означают или ошибку в логике программы, или проблемы с внешним ресурсом, или незнание документации. На большой проект общих компонент у меня отлавливаются:
S>— InvalidOperationException — для отлова Expression.MakeBinary для типов без соответствующих операторов.
S>— ArgumentException — для отлова ошибки разбора текстовых команд (опционально — rethrow)
S>— OperationCanceledException — для отлова отмены Parallel.ForEach
S>— SqlException — для проверки соединения и получения enum-а с причиной ошибки.
S>— IOException — для проверки, не заняты ли приложением файл/папка и
S>— IOException — для отлова "фичи" explorer-а, не закрывающего хендл удаляемой папки — Thread.Yield() + ещё одна попытка удалить (на этот раз без catch).

S>Несколько особняком стоит AppSingleton, использующий named pipe для проверки единственности процесса/передачи параметров командной строки уже запущенному процессу. Там отлавливаются UnauthorizedAccessException, IOException, TimeoutException и EndOfStreamException.

S>Если не считать Expression.MakeBinary и Parallel.ForEach, всё остальное — отлов граблей с внешними ресурсами.

S>Поэтому не надо путать публичный контракт метода — его нарушение отлавливаться вообще не должно — и сообщения вида "фигня случилась!". Обрабатывать надо только последние, и то, если мы либо знаем причины этой фигни, либо сами являемся причиной.


S>Читать — в первую очередь — framework design guidelines. Также более-менее подробно расписано тут:

S>http://msdn.microsoft.com/en-us/library/ms229014.aspx
S>http://bellouti.wordpress.com/2009/08/28/guidelines-for-consistent-exception-and-error-handling/

читаю http://msdn.microsoft.com/ru-ru/magazine/dd419661.aspx

Затем система исключений очистит состояние каждого кадра на стеке вызова между тем местом, где возникло исключение, и тем, где оно будет обработано (второй проход). По мере очистки стека среда CLR будет выполнять блоки finally и fault в каждом кадре. Затем выполнится инструкция catch в обрабатывающем исключение кадре


что означает очистит состояние каждого кадра? Какого кадра? Как это вообще выглядит?
Re[3]: книги и литература по Exception
От: Sinix  
Дата: 09.02.11 16:18
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>т.е. откат внутри finally? Finally я так понимаю выполнится в любом случае, успешным или нет был блок try? Может откат всё же в блоке catch?

Можно и так — пустой catch с "throw;" в конце. Я обычно использую нечто наподобие
bool succeed = false;
try
{
  // ...
  succeed = true
}
finally
{
  if (!succeed)
  {
  }
}

, но это уже вкусовщина.

А>что значит "на откуп unhandled exception handler"?

Это значит что у вас всегда должен быть способ узнать о необработанной ошибке в приложении. Как именно — через свою обёртку/AppDomain.UnhandledException/Application.ThreadException (какеготам?) — неважно.

А>что значит "код stateless"?

Каждый метод не имеет побочных эффектов (не изменяет поля, системные настройки, внешние ресурсы etc). Как следствие, если при вызове этого метода произошла ошибка, мы спокойно можем её отловить, т.к. знаем, что остальной код от этой ошибки никак не пострадает.

Ещё (уже писал выше) можно спокойно отлавливать исключения, если метод "подбирает за собой": в случае ошибки отменяет все сделанные изменения и пробрасывает ошибку дальше.


А>читаю http://msdn.microsoft.com/ru-ru/magazine/dd419661.aspx

Поверьте, проще бороться со своим незнанием английского, чем с переводчиком и его незнанием матчасти и технических терминов.

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx

The exception system will then unwind the state of each frame on the call stack between where the exception is raised and where it will be handled (known as the second pass). As the stack unwinds, the CLR will run both finally clauses and fault clauses in each frame as it is unwound. Then, the catch clause in the handling frame is executed.

Как можно перевести "unwind" как "очистить", а stack frame — как "кадр стека" Даже промт так не тупит
Re[4]: книги и литература по Exception
От: Аноним  
Дата: 09.02.11 17:31
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>т.е. откат внутри finally? Finally я так понимаю выполнится в любом случае, успешным или нет был блок try? Может откат всё же в блоке catch?

S>Можно и так — пустой catch с "throw;" в конце. Я обычно использую нечто наподобие
S>, но это уже вкусовщина.

понял о чём Вы

А>>что значит "на откуп unhandled exception handler"?

S>Это значит что у вас всегда должен быть способ узнать о необработанной ошибке в приложении. Как именно — через свою обёртку/AppDomain.UnhandledException/Application.ThreadException (какеготам?) — неважно.

я так понимаю, CSE ошибки не будут пойманы тем же UnhandledException ?

А>>что значит "код stateless"?

S>Каждый метод не имеет побочных эффектов (не изменяет поля, системные настройки, внешние ресурсы etc). Как следствие, если при вызове этого метода произошла ошибка, мы спокойно можем её отловить, т.к. знаем, что остальной код от этой ошибки никак не пострадает.

S>Ещё (уже писал выше) можно спокойно отлавливать исключения, если метод "подбирает за собой": в случае ошибки отменяет все сделанные изменения и пробрасывает ошибку дальше.


ну да, это само собой. Я вообще обворачиваю в "запрещенное" try {...} catch {} те области, которые не повлияют на состояние программы (например, запуск подсказки). Ну не вылезет подсказка — и фиг с ней.


А>>читаю http://msdn.microsoft.com/ru-ru/magazine/dd419661.aspx

S>Поверьте, проще бороться со своим незнанием английского, чем с переводчиком и его незнанием матчасти и технических терминов.

просто техническую документацию читаю без труда. Сложную иногда и на русском медленно и по несколько раз, куда уж ещё и на англ читать.
Re[5]: книги и литература по Exception
От: Sinix  
Дата: 10.02.11 01:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>что значит "на откуп unhandled exception handler"?

S>>Это значит что у вас всегда должен быть способ узнать о необработанной ошибке в приложении. Как именно — через свою обёртку/AppDomain.UnhandledException/Application.ThreadException (какеготам?) — неважно.

А>я так понимаю, CSE ошибки не будут пойманы тем же UnhandledException ?

Если сам рантайм не убъёт процесс — то будут.

Проверьте сами (попробуйте раскомментарить закомментаренные участки кода):
  Скрытый текст
using System;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
using System.Threading;

namespace Sinix.Samples.ExceptionHandling
{
  internal class Program
  {
    private static void Main(string[] args)
    {
      AppDomain.CurrentDomain.UnhandledException +=
        (s, e) => Console.WriteLine(@"Unhandled: {0}", ((Exception)e.ExceptionObject).Message);

      Console.WriteLine("Succeed?: {0}", TryDoSomething());
      Console.ReadKey();
    }

    //[HandleProcessCorruptedStateExceptions]
    private static bool TryDoSomething()
    {
      bool result = false;
      try
      {
        Fail();
        result = true;
      }
      catch (Exception ex)
      {
        Console.WriteLine(@"Catch: {0}", ex.Message);
        //throw;
      }
      finally
      {
        Console.WriteLine("Finally - DoSomethingUnsafe");
      }
      return result;
    }

    //[HandleProcessCorruptedStateExceptions]
    private static void Fail()
    {
      try
      {
        Errors.AccessViolation();
      }
      finally
      {
        Console.WriteLine("Finally - fail");
      }
    }
  }

  // THANKSGOTO: http://stackoverflow.com/questions/3561545/how-to-terminate-a-program-when-it-crashes-which-should-just-fail-a-unit-test-i/3561572#3561572
  public static class Errors
  {
    public static void StackOverflow()
    {
      StackOverflow();
    }

    public static void CustomException()
    {
      throw new Exception();
    }

    public static unsafe void AccessViolation()
    {
      byte b = *(byte*)(8762765876);
    }

    // THANKSGOTO: http://stackoverflow.com/questions/2950130/how-to-simulate-a-corrupt-state-exception-in-net-4/2950307#2950307
    public static unsafe void CorruptState()
    {
      var obj = new byte[1];
      var pin = GCHandle.Alloc(obj, GCHandleType.Pinned);
      byte* p = (byte*)pin.AddrOfPinnedObject();
      for (int ix = 0; ix < 256; ++ix) *p-- = 0;
      GC.Collect();   // kaboom
    }

    public static void DoSuicide()
    {
      Thread.CurrentThread.Abort();
    }
    public static void Exit()
    {
      Environment.Exit(0);
    }
    public static void FailFast()
    {
      Environment.FailFast("FailFast");
    }
  }
}



А>ну да, это само собой. Я вообще обворачиваю в "запрещенное" try {...} catch {} те области, которые не повлияют на состояние программы (например, запуск подсказки). Ну не вылезет подсказка — и фиг с ней.

Такие штуки надо делать _очень_ осторожно и явно помечать код как failsafe. Обернёте в try-catch такой код:
// псевдокод
void BeginEdit()
{
  if (inEdit) throw;
  inEdit = true;
}
void DoWork()
{
  BeginEdit();
  // Fail();
  EndEdit();
}

— получите необратимо нарушенное состояние. Всё, что вы теперь можете — сохранить данные (если можно) и упасть. Но это и так можно сделать ч/з unhandled exception handler.

А>просто техническую документацию читаю без труда. Сложную иногда и на русском медленно и по несколько раз, куда уж ещё и на англ читать.

Это очень сильно зависит от переводчика. Того же Рихтера (2е изд) я на русском так до конца и не прочёл. Тонны ляпов, самостоятельно придуманные термины и (изредка) смысл перевода был противоположен оригинальному тексту. Нафиг-нафиг.

Можно практически моментально набрать нужный скилл, прочитав (с лингво под боком) какую-нибудь нетехническую литературу. Только подбирать надо что-то, чтобы цепляло и не оторваться. Неделя-две неспешного чтения по вечерам — сами увидите результаты
Re[6]: книги и литература по Exception
От: Аноним  
Дата: 10.02.11 11:25
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>>>что значит "на откуп unhandled exception handler"?

S>>>Это значит что у вас всегда должен быть способ узнать о необработанной ошибке в приложении. Как именно — через свою обёртку/AppDomain.UnhandledException/Application.ThreadException (какеготам?) — неважно.

А>>я так понимаю, CSE ошибки не будут пойманы тем же UnhandledException ?

S>Если сам рантайм не убъёт процесс — то будут.

S>Проверьте сами (попробуйте раскомментарить закомментаренные участки кода):


спасибо, попробую. тогда я ничего не понял в эксепшенах

А>>ну да, это само собой. Я вообще обворачиваю в "запрещенное" try {...} catch {} те области, которые не повлияют на состояние программы (например, запуск подсказки). Ну не вылезет подсказка — и фиг с ней.

S>Такие штуки надо делать _очень_ осторожно и явно помечать код как failsafe. Обернёте в try-catch такой код:
S>
S>// псевдокод
S>void BeginEdit()
S>{
S>  if (inEdit) throw;
S>  inEdit = true;
S>}
S>void DoWork()
S>{
S>  BeginEdit();
S>  // Fail();
S>  EndEdit();
S>}
S>

S>- получите необратимо нарушенное состояние. Всё, что вы теперь можете — сохранить данные (если можно) и упасть. Но это и так можно сделать ч/з unhandled exception handler.

не понял кого обернуть в try-catch? BeginEdit? или Fail? Если Fail то не вижу ничего предосудительного если Fail грохнется. Где нарушенное состояние?

А>>просто техническую документацию читаю без труда. Сложную иногда и на русском медленно и по несколько раз, куда уж ещё и на англ читать.

S>Это очень сильно зависит от переводчика. Того же Рихтера (2е изд) я на русском так до конца и не прочёл. Тонны ляпов, самостоятельно придуманные термины и (изредка) смысл перевода был противоположен оригинальному тексту. Нафиг-нафиг.

S>Можно практически моментально набрать нужный скилл, прочитав (с лингво под боком) какую-нибудь нетехническую литературу. Только подбирать надо что-то, чтобы цепляло и не оторваться. Неделя-две неспешного чтения по вечерам — сами увидите результаты


блин, у меня такое ощущение что мозги не в ту сторону повёрнуты. Я 2 месяца каждый день смотрел фильмы на англ. Сначала переводил неизвестные мне слова, потом их учил, потом фильм понимал целиком. Уходило на это часа 2 в день. Англ. обогатился может быть на пару сотен слов, которые я уже и забыл.
Re[6]: книги и литература по Exception
От: Аноним  
Дата: 10.02.11 11:36
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>>>что значит "на откуп unhandled exception handler"?

S>>>Это значит что у вас всегда должен быть способ узнать о необработанной ошибке в приложении. Как именно — через свою обёртку/AppDomain.UnhandledException/Application.ThreadException (какеготам?) — неважно.

А>>я так понимаю, CSE ошибки не будут пойманы тем же UnhandledException ?

S>Если сам рантайм не убъёт процесс — то будут.

S>Проверьте сами (попробуйте раскомментарить закомментаренные участки кода):

S>
  Скрытый текст
S>
S>using System;
S>using System.Runtime.ExceptionServices;
S>using System.Runtime.InteropServices;
S>using System.Threading;

S>namespace Sinix.Samples.ExceptionHandling
S>{
S>  internal class Program
S>  {
S>    private static void Main(string[] args)
S>    {
S>      AppDomain.CurrentDomain.UnhandledException +=
S>        (s, e) => Console.WriteLine(@"Unhandled: {0}", ((Exception)e.ExceptionObject).Message);

S>      Console.WriteLine("Succeed?: {0}", TryDoSomething());
S>      Console.ReadKey();
S>    }

S>    //[HandleProcessCorruptedStateExceptions]
S>    private static bool TryDoSomething()
S>    {
S>      bool result = false;
S>      try
S>      {
S>        Fail();
S>        result = true;
S>      }
S>      catch (Exception ex)
S>      {
S>        Console.WriteLine(@"Catch: {0}", ex.Message);
S>        //throw;
S>      }
S>      finally
S>      {
S>        Console.WriteLine("Finally - DoSomethingUnsafe");
S>      }
S>      return result;
S>    }

S>    //[HandleProcessCorruptedStateExceptions]
S>    private static void Fail()
S>    {
S>      try
S>      {
S>        Errors.AccessViolation();
S>      }
S>      finally
S>      {
S>        Console.WriteLine("Finally - fail");
S>      }
S>    }
S>  }

S>  // THANKSGOTO: http://stackoverflow.com/questions/3561545/how-to-terminate-a-program-when-it-crashes-which-should-just-fail-a-unit-test-i/3561572#3561572
S>  public static class Errors
S>  {
S>    public static void StackOverflow()
S>    {
S>      StackOverflow();
S>    }

S>    public static void CustomException()
S>    {
S>      throw new Exception();
S>    }

S>    public static unsafe void AccessViolation()
S>    {
S>      byte b = *(byte*)(8762765876);
S>    }

S>    // THANKSGOTO: http://stackoverflow.com/questions/2950130/how-to-simulate-a-corrupt-state-exception-in-net-4/2950307#2950307
S>    public static unsafe void CorruptState()
S>    {
S>      var obj = new byte[1];
S>      var pin = GCHandle.Alloc(obj, GCHandleType.Pinned);
S>      byte* p = (byte*)pin.AddrOfPinnedObject();
S>      for (int ix = 0; ix < 256; ++ix) *p-- = 0;
S>      GC.Collect();   // kaboom
S>    }

S>    public static void DoSuicide()
S>    {
S>      Thread.CurrentThread.Abort();
S>    }
S>    public static void Exit()
S>    {
S>      Environment.Exit(0);
S>    }
S>    public static void FailFast()
S>    {
S>      Environment.FailFast("FailFast");
S>    }
S>  }
S>}
S>



попробовал (кстати, зачем там CorruptState, DoSuicide и прочие?) — работает как я и ожидал. Если не помечено HandleProcessCorruptedStateExceptions — валится на AccessViolation, если помечено — обрабатывается в try-catch. UnhandledException в обоих случаях не вызывается (.NET Framework 4 Client Profile)
Re[7]: книги и литература по Exception
От: Sinix  
Дата: 10.02.11 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не понял кого обернуть в try-catch? BeginEdit? или Fail? Если Fail то не вижу ничего предосудительного если Fail грохнется. Где нарушенное состояние?

Вызов DoWork, конечно

А>блин, у меня такое ощущение что мозги не в ту сторону повёрнуты. Я 2 месяца каждый день смотрел фильмы на англ. Сначала переводил неизвестные мне слова, потом их учил, потом фильм понимал целиком. Уходило на это часа 2 в день. Англ. обогатился может быть на пару сотен слов, которые я уже и забыл.


Это бесполезно — вы никак не используете выученные фонемы и они тут же забываются, сам так тратил время. В первую очередь надо набирать словарный запас и регулярно его использовать — т.е. побольше читать на английском




А>попробовал (кстати, зачем там CorruptState, DoSuicide и прочие?)

Код выдран с мясом из тестов логгера. Каждый метод падает по-разному

А> — работает как я и ожидал. Если не помечено HandleProcessCorruptedStateExceptions — валится на AccessViolation, если помечено — обрабатывается в try-catch.

А то, что finally без HandleProcessCorruptedStateExceptions не вызывается тоже — заметили? Я вот напоролся при переезде.

А>UnhandledException в обоих случаях не вызывается (.NET Framework 4 Client Profile)

А, забыл
    private static void Main(string[] args)
    {
      AppDomain.CurrentDomain.UnhandledException += Unhandled;

      Console.WriteLine("Succeed?: {0}", TryDoSomething());
      Console.ReadKey();
    }
    [HandleProcessCorruptedStateExceptions]
    private static void Unhandled(object sender, UnhandledExceptionEventArgs e)
    {
      Console.WriteLine(@"Unhandled: {0}", ((Exception)e.ExceptionObject).Message);
    }
    // ...

Вот так — вызывается.
Re[8]: книги и литература по Exception
От: Аноним  
Дата: 10.02.11 14:47
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Это бесполезно — вы никак не используете выученные фонемы и они тут же забываются, сам так тратил время. В первую очередь надо набирать словарный запас и регулярно его использовать — т.е. побольше читать на английском


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

А>> — работает как я и ожидал. Если не помечено HandleProcessCorruptedStateExceptions — валится на AccessViolation, если помечено — обрабатывается в try-catch.

S>А то, что finally без HandleProcessCorruptedStateExceptions не вызывается тоже — заметили? Я вот напоролся при переезде.

да, про это МС предупреждает, либо нужно пометить всю сборку как отлавливающую все эксепшены (в том числе и CSE). Блин, вечно они всё меняют притом в таких местах, которые вылезут обязательно только у заказчика и можно неделю гадать что происходит.

А>>UnhandledException в обоих случаях не вызывается (.NET Framework 4 Client Profile)

S>А, забыл
S>
S>    private static void Main(string[] args)
S>    {
S>      AppDomain.CurrentDomain.UnhandledException += Unhandled;

S>      Console.WriteLine("Succeed?: {0}", TryDoSomething());
S>      Console.ReadKey();
S>    }
S>    [HandleProcessCorruptedStateExceptions]
S>    private static void Unhandled(object sender, UnhandledExceptionEventArgs e)
S>    {
S>      Console.WriteLine(@"Unhandled: {0}", ((Exception)e.ExceptionObject).Message);
S>    }
S>    // ...
S>

S>Вот так — вызывается.

спасибо.
Re[8]: книги и литература по Exception
От: Аноним  
Дата: 10.02.11 15:12
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>не понял кого обернуть в try-catch? BeginEdit? или Fail? Если Fail то не вижу ничего предосудительного если Fail грохнется. Где нарушенное состояние?

S>Вызов DoWork, конечно

S>Такие штуки надо делать _очень_ осторожно и явно помечать код как failsafe. Обернёте в try-catch такой код:

S>
S>// псевдокод
S>void BeginEdit()
S>{
S>  if (inEdit) throw;
S>  inEdit = true;
S>}
S>void DoWork()
S>{
S>  BeginEdit();
S>  // Fail();
S>  EndEdit();
S>}
S>

S>- получите необратимо нарушенное состояние. Всё, что вы теперь можете — сохранить данные (если можно) и упасть. Но это и так можно сделать ч/з unhandled exception handler.

что значит пометить как failsafe? как это делается?
если я оберну в try/catch DoWork — то что случится? inEdit как была тру в случае вылета эксепшена, так и установится в тру. EndEdit не выполнится. Я понимаю, что нужно следить чтобы значения переменных до вызова и после были идентичными. В таком случае, как я понимаю, подводных камней не предвещается
Re[9]: книги и литература по Exception
От: Sinix  
Дата: 10.02.11 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Это бесполезно — вы никак не используете выученные фонемы и они тут же забываются, сам так тратил время. В первую очередь надо набирать словарный запас и регулярно его использовать — т.е. побольше читать на английском


А>ну как его можно регулярно использовать, если вокруг тебя не англоязычные...

Элеменарно Чтение книг/блогов/форумов, поиск решений и общение на англоязычных сайтах.




А>что значит пометить как failsafe? как это делается?

Да посто в комментариях — чтобы следующий кодер не поломал чего. Или используйте ReliabilityContractAttribute, только неплохо предварительно почитать — куда оно и зачем.

А>если я оберну в try/catch DoWork — то что случится? inEdit как была тру в случае вылета эксепшена, так и установится в тру. EndEdit не выполнится.

Угумс. А теперь представьте, что 99% вашего кода так или иначе дёргает BeginEdit и отлавливает исключения. Приложение не падает, но сделать вы ничего не сможете. Или гораздо худший сценарий: BeginEdit вызывается очень редко и часть кода не отлавливает исключения. Как результат, приложение будет падать нечасто, но ВНЕЗАПНО. И ни по стеку вызовов, ни дампу вы не узнаете настоящую причину падения — проблема возникла давным-давно.

А>Я понимаю, что нужно следить чтобы значения переменных до вызова и после были идентичными. В таком случае, как я понимаю, подводных камней не предвещается


Не только значения полей. События, внешние ресурсы (например, файлы или ключи реестра), блокировки — всё что так или иначе влияет на логику вашего (или чужого) приложения не должно находиться в рассогласованном состоянии.

А то некоторые попользуются таким "надёжным" ПО и начинают предъявлять претензии
Автор: McSeem2
Дата: 30.11.10
к дотнету в целом.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.