лучшая практика для обработки этого случая исключения - PullRequest
0 голосов
/ 21 января 2010

Допустим, methodA и methodB оба сгенерируют пару типов исключений, и некоторые исключения относятся к одному и тому же типу, а некоторые нет, так как лучше всего это обрабатывать?

стиль A:

void foo()
    {
        try
        {
            methodA();
        }
        catch (exceptionTypeA)
        {
            handleA;
        }

        try
        {
            methodB();
        }
        catch (exceptionB)
        {
            handleB;
        }
    }

стиль B:

void foo()
    {
        try
        {
            methodA();
            methodB();
        }
        catch (exceptionTypeA)
        {
            handleA;
        }
        catch (exceptionB)
        {
            handleB;
        }
    }

Ответы [ 8 ]

11 голосов
/ 21 января 2010

Ни один не "лучше"; они просто разные. В зависимости от того, что вы делаете в своем блоке catch, первая опция разрешит выполнение methodB, даже если methodA выдает исключение типа exceptionTypeA, тогда как второй блок требует, чтобы methodA был успешным для methodB подлежит вызову.

4 голосов
/ 21 января 2010

Это зависит от ваших намерений.

Если methodA может выдать exceptionB (и наоборот), и вы хотите, чтобы эти исключения также обрабатывались, используйте стиль B.

Если вы не ожидаете, что methodA выдаст exceptionB (и наоборот), или не готовы обработать его на этом этапе, используйте стиль A, чтобы исключить непреднамеренное обнаружение и скрытие исключений от вызывающей стороны.

2 голосов
/ 21 января 2010

В вашем конкретном случае это зависит от того, что вы хотите сделать:

Если вы хотите остановить выполнение везде, где возникает исключение MethodA или MethodB, тогда вы идете вторым путем.

Если вы хотите выполнить MethodB после завершения MethodA (успешно или нет), тогда вы идете первым путем.

1 голос
/ 21 января 2010

Зависит от того, что код, по-видимому, подразумевает, что methodA и methodB будут выбрасывать только exceptionTypeA и exceptionB соответственно.Учитывая, что я обычно использовал бы второй метод.

Однако, есть различия в поведении.Если возникает исключение для метода A, вы хотите, чтобы methodB выполнялся?В первом примере он будет выполнять methodB, даже если исключение происходит в methodA.Во втором примере это не так.

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

1 голос
/ 21 января 2010

Основное различие между этими двумя примерами состоит в том, что во втором примере, если methodA(); выдает исключение, выполнение methodB(); не произойдет. В вашем первом примере будут выполняться и methodA();, и methodB();, независимо от ошибки methodA();. Поэтому это не вопрос стиля, а скорее ожидание. Если вы ОЖИДАЕТЕ methodB();, чтобы выполнить, несмотря ни на что, первый пример для вас. Если methodB(); потерпит неудачу, когда methodA();, то пример два - это путь.

1 голос
/ 21 января 2010

Это зависит, если exceptionTypeB не наследует exceptionTypeA.

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

В Style B сначала нужно поймать более конкретное исключение, а затем более общее.

StyleB более "производительный", потому что два try catch блоков требуют больше ресурсов и занимают больше времени, чем один.

1 голос
/ 21 января 2010

Ваш пример кода не эквивалентен. В вашем первом примере A methodB() всегда будет выполняться, в то время как в примере B он не будет выполнен, если A сгенерирует.

В зависимости от этой семантики вам нужно решить, какой «стиль» использовать.

0 голосов
/ 21 января 2010

Мне больше нравится метод B, но иногда необходим метод A. Например, если methodA и methodB оба могут генерировать одно и то же исключение, но вам нужно знать, какое из них выдает его в блоке catch.

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