C # Выкинуть Exception и поймать тем же способом, почему это плохо? - PullRequest
0 голосов
/ 21 ноября 2018

Поговорим об одной реализации:

// Pseudocode
accessor type GetValue() 
{
    try
    {
        do some action with possible throw exception1
        do some action with possible throw exception2

        return value;
    }
    catch (Exception ex)
    {
        value = default;
        throw Wraped in Meaningfull Exception ex

    }
}

Может кто-нибудь объяснить, почему это может быть плохой дизайн, использовать try - catch таким образом (throw и catch при одном и том же методе)безопасно совершать какие-либо действия и согласовывать разные типы похожих исключений?

1 Ответ

0 голосов
/ 21 ноября 2018

Это не перебрасывание

 throw new WrapedException("MyNewMessage", ex);

, что неправильно, но ловит все исключения

 catch (Exception ex) {
   ...
 }

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

   try {
     someValue = GetValue();
   }
   catch (WrapedException) {  
     // We failed to obtain someValue;
     // The reason - WrapedException - is innocent
     // Let's use default value then

     someValue = defaultSomeValue;
   }

И фактическое изображение

   public GetValue() {
     try {
       do some action with possible throw exception1

       // Catastrophy here: AccessViolationException! System is in ruins!
       do some action with possible throw exception2

       return value;
     }
     catch (Exception ex) { // AccessViolationException will be caught...
       // ...and the disaster will have been masked as being just WrapedException
       throw new WrapedException("MyNewMessage", ex);
     }
   }

Ваш дизайн в порядке, если вы ловите только ожидаемые типы исключений:

   public GetValue() {
     try {
       do some action with possible throw exception1
       do some action with possible throw exception2

       return value;
     }
     catch (FileNotFound ex) {
       // File not found, nothing special in the context of the routine
       throw new WrapedException("File not found and we can't load the CCalue", ex);
     }
   }
...