Как сбросить исключение и вернуть значение в C #? - PullRequest
5 голосов
/ 31 января 2011

Учитывая следующий код, как я могу вернуть некоторое значение (DateTime.Now.ToString ()), если выброшено исключение?

public string DateToString(int year, int month, int day)
{
    try
    {
        DateTime datetime = new DateTime(year, month, day);
        return datetime.ToString();
    }
    catch (Exception)
    {
        //log error and rethrow
        throw;
    }
}

Ответы [ 5 ]

13 голосов
/ 31 января 2011

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

Когда вы вызываете метод, который выдает исключение, управление немедленно передается в блок catch.
У вас не будет возможности наблюдать или использовать возвращаемое (несуществующее) значение.

Вы должны переосмыслить свой дизайн.

3 голосов
/ 31 января 2011

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

public string DateToString(int year, int month, int day)
{
    try
    {
        DateTime datetime = new DateTime(year, month, day);
        return datetime.ToString();
    }
    catch (Exception exObj)
    {
        //log error
        LogMyError(exObj);
        return DateTime.Now.ToString();
    }
}
2 голосов
/ 31 января 2011

Я рекомендую вам сделать это следующим образом:

    bool IsValidDateTime(int year, int month, int day, out DateTime result)
    {
        try
        {
            result = new DateTime(year, month, day);
            return true;
        }
        catch (System.Exception ex)
        {
            result = DateTime.Now; // assign a value
            return false;
        }
    }

Если вам нужна строка, просто убедитесь, что возвращаемое значение истинно, и вызовите

 result.ToString();
1 голос
/ 31 января 2011

Редактировать: cyberkiwi понял вопрос лучше, чем я, но я оставлю его в качестве плохого примера чтения;)


Вы всегда можете определить собственный класс исключений:

[Serializable()]
public class OwnException : System.Exception
{
    public readonly MaybeDateTime;

    ...
    public OwnException (string message, System.Exception inner) :  base(message, inner) { maybe = null; }
    public OwnException (string message, System.Exception inner, DateTime maybe) :  base(message, inner) { MaybeDateTime = maybe; }
}

и бросьте это (присваивая datetime ).

Вы должны будете перенести объявление DateTime datetime вне try-catch-блок и в твоем примере SLaks прав: это не имеет смысла. datetime может содержать что-то значимое только в том случае, если оператор return выдает пойманное исключение.В других случаях могут быть полезны приложения.

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

1 голос
/ 31 января 2011

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

Как:

// Will a value be assigned to dateString, or will an exception be thrown?
string dateString = DateToString(2011, 2, 29);

Если вы хотите от DateToString до вернуть значение в исключительном случае, указанном выше, то вы хотите, чтобы это значение было присвоено dateString, верно? Но тогда что вы хотите сделать с исключением? Либо вы собираетесь продолжить, либо нет; Вы не можете иметь это в обоих направлениях.

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