Существует ли стандарт, “никогда не возвращает” атрибут для функций C#?

partition и rpartition также удобны для таких вещей:

url.rpartition('/')[2]
29
задан user192472 4 January 2010 в 12:13
поделиться

7 ответов

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

22
ответ дан David M 14 October 2019 в 07:18
поделиться

Бернхоф ответил правильно. Однако, если вы пытаетесь инкапсулировать большую часть логики при создании экземпляра вашего исключения, тогда все, что вам нужно сделать, это изменить свой код с этого: 117] Тогда ваш код вызова будет выглядеть следующим образом:

int foo(int x, y) {
    if (y == 0) {
        throw makeException("Doh!");
    }
    return x / y;
}

При прочих равных условиях предпочитают функциональный код процедурному коду. Проще использовать повторно и юнит-тестирование.

РЕДАКТИРОВАТЬ:

В свете примера кода Фреда, это то, что я бы сделал. Это не кодовый контракт, но он все еще функционирует.

private int getVarID(string s_varID) {
    int varID;
    if(s_varID == "ILT") {
        return 123;
    } else if(s_varID == "TL") {
        return 456;
    } else if(s_varID == "FT") {
        return 789;
    } else if(int.TryParse(s_varID, out varID)) {
        return varID;
    } else {
        throw makeParseError("varID must be an integer or 'ILT', 'TL' or 'FT'.");
    }
}
10
ответ дан Christian Hayter 14 October 2019 в 07:18
поделиться

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

3
ответ дан slugster 14 October 2019 в 07:18
поделиться

Бернхоф уже дал вам способ избежать жалоб компилятора. Однако следует также помнить, что трассировка стека будет отключена (а некоторые библиотеки логгеров не будут обрабатывать методы util-classed-i-throw-exceptions-for-your-app), что затрудняет отладку приложения.

1
ответ дан Rick 14 October 2019 в 07:18
поделиться

Почему бы просто не поменять его на

int foo(int x, y)
{
    if (y == 0)
        throwException("Doh!");
    return x/y;
}

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

32
ответ дан 27 November 2019 в 23:21
поделиться

Ваша функция

void throwException(string msg)
{
    throw new MyException(msg);
}

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

Обычной практикой было бы расширить MyException для этого конкретного случая и бросить следующее:

public class HomerSimpsonException : MyException
{
   public HomerSimpsonException() : base ("DOH!!!"){
   }
}
int foo(int x, y)
{
    if (y == 0)
        throw new HomerSimpsonException();
    else
        return x/y;
}

Даже в этом случае, согласно правилу Microsoft для расширения исключений, существует как минимум 4 конструктора, которые вы должны реализовать - http://msdn.microsoft.com/en-us/library/ms182151%28VS.80. %29.aspx, а именно:

  public NewException(){}
  public NewException(string){}
  public NewException(string, Exception){}
  protected or private NewException(SerializationInfo, StreamingContext){}
2
ответ дан 27 November 2019 в 23:21
поделиться

Удалите ключевое слово 'else', оно все равно избыточно, и оно сработает;)

1
ответ дан 27 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

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