Как пометить метод безоговорочно? - PullRequest
9 голосов
/ 05 октября 2009

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

У меня есть такой код:

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  // notice that x is not yet set here, but compiler doesn't complain

  throw new Exception( "missed something." );
}

Если я попытаюсь написать это так, у меня возникнет проблема:

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  // compiler complains about x not being set yet

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}

Есть предложения? Спасибо.

Ответы [ 7 ]

17 голосов
/ 05 октября 2009

Как насчет этого?

bool condition() { return false; }
int bar() { return 999; }
void foo(out int x)
{
    if (condition()) { x = bar(); return; }
    // compiler complains about x not being set yet 
    throw MyMethodThatAlwaysThrowsAnException("missed something.");
}
Exception MyMethodThatAlwaysThrowsAnException(string message)
{
    //this could also be a throw if you really want 
    //   but if you throw here the stack trace will point here
    return new Exception(message);
}
2 голосов
/ 18 декабря 2012

Это очень старая тема, но я просто хочу добавить, что вы должны написать ее иначе, чем в начале:

void foo(out int x)
{
    if (!condition()) 
        MyMethodThatAlwaysThrowsAnException("missed something.");

    x = bar();
    // and so on...
}

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

2 голосов
/ 05 октября 2009

Нет способа пометить метод таким способом.

Возможно, не имеет значения, но шаблон в вашем примере, использующий параметр out, немного странный. Почему бы просто не иметь возвращаемый тип метода вместо этого?

int Foo()
{
    if (condition()) return bar();

    MyMethodThatAlwaysThrowsAnException("missed something.");
}
2 голосов
/ 05 октября 2009

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

void foo(out int x)
{
  if( condition() ) { x = bar(); return; }

  x = 0;

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}
1 голос
/ 05 октября 2009

Если вы не хотите устанавливать x, почему бы вам не использовать вместо этого параметр ref?

void foo(ref int x)
{
  if( condition() ) { x = bar(); return; }

  // nobody complains about anything

  MyMethodThatAlwaysThrowsAnException( "missed something." );
}
1 голос
/ 05 октября 2009

x является параметром out и должен быть задан перед тем, как двигаться вперед

0 голосов
/ 05 октября 2009

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

void foo(out int x)
{
    x = 0;
    if( condition() ) { x = bar(); return; }
    MyMethodThatAlwaysThrowsAnException( "missed something." );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...