попробовать исключение catch catch

Мы часто используем команды try catch в нашем методе, если метод может возвращать значение, но значение не является строкой, как вернуть сообщение об исключении? Например:

public int GetFile(string path)
{
    int i;
    try
    {
        //...
        return i;
    }
    catch (Exception ex)
    { 
       //How to return the ex?
       //If the return type is a custom class, how to deal with it?
    }
 }

Как вернуть исключение?

2
nl ja de
просто напишите "бросок"
добавлено автор Tilak, источник
Вы не можете вернуть сообщение об ошибке здесь. Верните некоторое значение int, которое понимается как код ошибки. Или, бросьте настраиваемое исключение, которое могут обрабатывать вызывающие функции/классы. Если тип возврата является настраиваемым классом, вы можете отправить нулевой объект или создать новый объект с некоторыми установленными значениями, которые указывают на возникшую ошибку.
добавлено автор ryadavilli, источник

3 ответы

Если вы просто хотите выбросить любое исключение, удалите блок try/catch.

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

  1. Handle those exceptions only.

    try
    {
        //...
        return i;
    }
    catch(IOException iex)
    { 
    
       //do something
       throw;
    }
    catch(PathTooLongException pex)
    { 
    
       //do something
       throw;
    }
    
  2. In generic handler do something for certain types

    try
    {
        //...
        return i;
    }
    catch(Exception ex)
    { 
         if (ex is IOException) 
         { 
        //do something
         }
         if (ex is PathTooLongException) 
         { 
         //do something 
    
         }
         throw;
    }
    
2
добавлено
No-no-no. Вы не должны ловить все исключения, а затем проверить тип. Catch target введите явно, т. Е. catch (IOException)
добавлено автор abatishchev, источник
Вы можете извлечь общий код в отдельный метод, чтобы увеличить повторное использование. Но да, действительно, обработка исключений часто является своего рода функциональным программированием с дублирующим кодом.
добавлено автор abatishchev, источник
В коде №2 будет выполняться ряд проверок (или более сложная логика), и только тогда будет выбрано исключительное исключение. Если вы их не поймаете, все будет немедленно выброшено. Также такой подход увеличивает вероятность ошибки.
добавлено автор abatishchev, источник
Лучше увеличить общий код и уменьшить дублирование возможного :)
добавлено автор abatishchev, источник
Ты прав. Но иногда это очень большой код болибера, если его применять несколько раз. Там я использую общий обработчик исключений.
добавлено автор Tilak, источник
это то, чем я занимаюсь
добавлено автор Tilak, источник
Обычно я определяю коды ошибок, исключение Wrapper и общие сообщения (с параметрами) в файле ресурсов. Все это относится к компоненту «Обработчик исключений». На мой взгляд, лучше проверить сложную логику один раз, а не дублировать ее повсюду.
добавлено автор Tilak, источник

Вы можете удалить try catch block, чтобы исключить исключение или исключение throw из блока catch, если вы хотите сделать что-то полезное в блоке catch, например, при регистрации исключения. Если вы хотите отправить сообщение исключения из своего метода и не хотите генерировать исключение , вы можете использовать out строковая переменная для хранения сообщения об исключении для метода вызова.

public int GetFile(string path, out string error)
{
    error = string.Empty.
    int i;
    try
    {
        //...
        return i;
    }
    catch(Exception ex)
    { 
        error = ex.Message;
       //How to return the ex?
       //If the return type is a custom class, how to deal with it?
    }
 }

Как вызвать метод.

string error = string.Empty;
GetFile("yourpath", out error);
2
добавлено
+1 Обычно я это делаю, если такой сценарий очень необходим
добавлено автор horgh, источник
Да, спасибо @ Потрясенный, исправлено.
добавлено автор Adil, источник

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

public int GetFile(string path)
{
        int i;
        try
        {
            //...
            return i;
        }
        catch (Exception ex)
        { 
            throw ex;
        }
}

и поймать, что при вызове метода вроде этого ...

public void callGetFile()
{
      try
      {
           int result = GetFile("your file path");
      }
      catch(exception ex)
      {
           //Catch your thrown excetion here
      }
}
0
добавлено
Не throw ex . Используйте только throw , вместо этого он не удаляет столбец.
добавлено автор abatishchev, источник
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)