Мысли о блоках try-catch

Это должно быть что-то вроде этого

    let items:SideBarMenu[]=[];
 let   item1:SideBarMenuItem=new SideBarMenuItem()    {
     code: '1',
     defaultLabel: 'Home ',
     icon: 'home',
     routerLink: ['/'],
     fragment: 'home-anchor'
    }

    items.push(item1);
6
задан Jon Seigel 4 April 2010 в 08:40
поделиться

10 ответов

В зависимости от того, какое качество вы смотрите, оно не создает исключение в другом месте. «throw» без цели сбрасывает исключение, которое очень отличается от броска исключения. В первую очередь повторное преобразование не сбрасывает трассировку стека.

В этом конкретном примере улов не имеет смысла, потому что он ничего не делает. Исключение счастливо переброшено, и это почти как если бы попытка / улов не существовала.

15
ответ дан 8 December 2019 в 05:23
поделиться

I think the construction should be used for handling the exceptions you know you will be throwing inside your code; if other exception is raised, then just rethrow.

Take into account that бросить; отличается от throw ex;

throw ex усекает стек до новой точки броска, теряя ценную информацию об исключении.

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (EspecificException ex)
    {
        HandleException(ex);
    }
    catch (Exception ex)
    {
        throw;
    }
}
3
ответ дан 8 December 2019 в 05:23
поделиться

Не было бы, в идеале, блок catch мог бы выполнить некоторую обработку, а затем сбросить, например,

try
{
    //do something
}
catch (Exception ex)
{
    DoSomething(ex); //handle the exception
    throw;
}

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

3
ответ дан 8 December 2019 в 05:23
поделиться

Иногда это уместно - когда вы собираетесь обработать исключение выше в стеке вызовов. Тем не менее, вам нужно сделать что-то в этом блоке перехвата, а не просто перебросить, чтобы это имело смысл, например, зарегистрировать ошибку:

public void doSomething()
{
    try
    {
       // actual code goes here
    }
    catch (Exception ex)
    {
        LogException (ex);  // Log error...
        throw;
    }
}
1
ответ дан 8 December 2019 в 05:23
поделиться

Делать что-то подобное довольно бессмысленно, и в целом я стараюсь не идти по пути бессмысленных дел;)

По большей части я верю в отлов конкретных типов исключений, с которыми вы знаете, как обращаться даже если это означает только создание собственного исключения с дополнительной информацией и использование перехваченного исключения в качестве InnerException.

1
ответ дан 8 December 2019 в 05:23
поделиться

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

Разница между этим и тем, что вы говорите, состоит в том, что эти пользовательские объекты Exception содержат БОЛЬШЕ информации о фактическом произошедшем исключении, а не меньше.

0
ответ дан 8 December 2019 в 05:23
поделиться

Зависит от того, что вы подразумеваете под «выглядит так», и если в блоке catch нет ничего кроме rethrow ... если это так, то попытка catch не имеет смысла, кроме как, как вы говорите, скрывать, где произошло исключение. Но если вам нужно что-то сделать прямо там, где произошла ошибка, но вы хотите обработать исключение в стеке, это может быть уместно. Но тогда улов будет для конкретного исключения, которое вы обрабатываете, а не для какого-либо исключения

0
ответ дан 8 December 2019 в 05:23
поделиться

Ну, для начала я бы просто сделал

catch
{
   throw;
}

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

Например,

catch(SQLException sex) //haha
{
   DoStuff(sex);
}
catch
{
   throw;
}
0
ответ дан 8 December 2019 в 05:23
поделиться

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

Я думаю, что было бы лучше на самом деле что-то сделать в подвохе.

Вы можете проверить Руководство по обработке исключений MSDN .

0
ответ дан 8 December 2019 в 05:23
поделиться

Generally having exception handling blocks that don't do anything isn't good at all, for the simple reason that it prevents the .Net Virtual Machine from inlining your methods when performance optimising your code.

For a full article on why see "Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks" by Scott Hanselman

0
ответ дан 8 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: