Проблема с обработкой исключений, ошибок и возвращаемых значений - PullRequest
1 голос
/ 30 июля 2011

Мне нужен твой совет. Мое исходное приложение стало очень ... расширенным. И у меня есть небольшая проблема, связанная с ошибками, исключениями и т. Д.

Например, у меня есть класс DatabaseProvider, где есть методы для связи с БД. Мне приходится иметь дело со стандартными исключениями, неверной базой данных формы (например, неправильный формат электронной почты), ошибками, возвращенными из базы данных. Все, что мне нужно, чтобы вернуться к функции, которая вызвала метод DatabaseProvider, так что этот метод будет регистрировать это исключение или ошибку, и все еще работает. Поэтому я не могу бросить исключение.

И если этого было недостаточно, я должен вернуть (из DatabaseProvider) значение в большинстве случаев или объект, или список объектов.

Вот я и подумал, может быть, создать класс «Ответ». И объект этого класса будет возвращен из каждого метода в моем приложении.

Sth, как это:

public class Response
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

Но как вернуть (например) список объектов самостоятельного проектирования одновременно?

Использование параметров "out" - это решение? Каков наилучший способ (лучшая практика)? Я искал об этом, но все, что я нашел, было то, как иметь дело с исключениями (только) ..

Ответы [ 2 ]

4 голосов
/ 30 июля 2011

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

public class MySpecificException: Exception
{
    public bool Error { get; set; }
    public string ErrorMessage { get; set; }        
    public bool DatabaseError { get; set; }
    public string DatabaseMessage { get; set; }

    public Exception ex { get; set; }
}

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

public void CallingFunction()
{
    try {
        //call your function
    }
    catch (MySpecificException ex) 
    {
        //log the data from the exception
    }

Это именно то, для чего предназначены пользовательские исключения.

Таким образом, вы все равно можете вернуть из функции то, что хотите вернуть (список или что-то еще).

3 голосов
/ 30 июля 2011

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

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

abstract class ResultWrapper
{
    //meta info, such as error references/properties/flags/statistics

    public ResultWrapper([meta info])
    {
        //set meta info
    }
}

class ResultList<T> : ResultWrapper
{
    public readonly List<T> resultList;

    //constructor for resultList, plus meta information for parent
    public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info])
    {
        this.resultList = resultList;
    }
}

class SingleResult<T> : ResultWrapper
{
    public readonly T result;

    //constructor similar to above
}

Редактировать: Исходя из ваших комментариев, вы обязательно должны использовать пользовательские исключения, которые вы можете генерировать (возможная упаковка вызывает исключения). Как сказал Петар, их можно поймать в цикле и обработать там, не останавливая выполнение последующих задач. Язык поддерживает обработку исключений по уважительным причинам - я бы использовал это.

Кроме того, к вашему сведению:

public bool Error { get; set; }
public string ErrorMessage { get; set; }

в bool нет необходимости. Просто проверьте ненулевое значение в сообщении об ошибке / поле для справки

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