C # - регистрация исключений и статус возврата - PullRequest
0 голосов
/ 12 января 2012

Изменение, чтобы прояснить:

У меня есть вопрос о регистрации исключений и изящном выходе.Это продолжение предыдущего вопроса .Код выглядит следующим образом:

string status = "0";
ClassA ObjA = new ClassA();

try
{
    status = objA.Method1();
    if (status != "-1")
    {                        
        status = objA.Method1();
    }
 }
 catch (Exception Ex)
 {
     //Log Exception EX
 }

Внутри Method1:

public string Method1()
{
    string status = "0";
    try
    {
        //Code
        return "0";
    }
    catch (Exception Ex)
    {
        //Log Exception with details
        return "-1"
    }
}

Я регистрирую Exception в вызывающем методе и возвращаю только статус вызывающей стороне.Должен ли я вернуть Exception вызывающему методу или достаточно только статуса.С состоянием «-1» я знаю, что в вызываемом методе было Exception, и подробности того, что Exception были зарегистрированы в файле журнала.

Ответы [ 6 ]

2 голосов
/ 12 января 2012

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

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

1 голос
/ 12 января 2012

Не используйте возвращаемое значение status, оно не добавляет ничего полезного для вас.

Рассмотрите,

var a = new ClassA()
try
{
    a.Mehtod1();
}
catch
{
    try
    {
        a.Method1();
    }
    catch (Exception ex)
    {
        //Log without details;
    }
}

class ClassA
{
    void Method1()
    {
        try
        {
             //Code
        }
        catch (Exception ex)
        {
            //Log with details
            throw;
        }            
    }
}

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

В целом, я предлагаю вам иметь один обработчик перехвата всех на верхнем уровне вашего приложения, который занимается журналированием, или не более одного на общедоступныйточка входа.Другие обработчики должны иметь дело с конкретными типами исключений, с которыми они могут «справиться» (что-то сделать.)

1 голос
/ 12 января 2012
class MyException : Exception
{
   public readonly int status;
   public  MyException(int status, string msg):base(msg)
   {
      this.status = status;
   }
}

public string Method1()
{   
   throw new MyException(-1,"msg");
    return "0";
}




SomeCode()
    {

         try
         {
                  Method1();
         }catch(MyException ex)
         { 
            ex.status //here you get the status
          }
     }
1 голос
/ 12 января 2012

Хм - в вашей ситуации я бы предпочел сделать следующее, но это действительно зависит от ситуации:

public string Method1()
{
    string status = "0";

    //Code - Exception may be thrown
    return "0";
}

string status = "0";
ClassA ObjA = new ClassA();
try
{
     status = objA.Method1();
 }
 Catch(Exception Ex)
 {
     //Log Exception EX
    status = "-1;
 }

РЕДАКТИРОВАНИЕ
Иногда трудно определить значенияуказать, произошла ли ошибка в методе.Вы должны помнить Nullable типов.Если вы можете найти подходящее возвращаемое значение, которое указывает на ошибки, также может быть нормально зарегистрировать ошибку в методе, который вызвал ошибку, и просто отреагировать на возвращаемое значение, как вы предлагали.ваш код вы звоните Method1 дважды, если первый вызов был успешным.Я думаю, это потому, что это быстрый пример ...

1 голос
/ 12 января 2012

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

Как правило, лучше всего помещать исключения туда, где они обрабатываются лучше всего. Если вы пишете фреймворк для взаимодействия с некоторым веб-сервисом, пользователи вашей фреймворка, скорее всего, не будут заботиться об исключениях в сети и т. Д. - им нужны коды возврата или, что еще лучше, некоторые специфичные для фреймворка исключения, которые вы включаете / code.

1 голос
/ 12 января 2012

Все зависит от цели и реализации кода; иногда лучше разрешить передачу исключений обратно вызывающей стороне - их следует использовать в исключительных случаях .

Однако, если вы намереваетесь использовать коды возврата, я был бы более склонен использовать enum (хотя, опять же, это зависит от цели кода). Таким образом, вызывающему абоненту легко проверить доступный выбор кодов возврата. Кроме того, комментарий об использовании целых чисел или строк в качестве кодов ошибок - для вызывающего абонента может быть не очень понятно, в чем проблема. В этом случае выбрасывание Exception или определенного типа (содержащего сообщение об ошибке) или возврат предопределенного enum с описательным именем будет более значимым для вызывающей стороны.

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