Как правильно перекинуть исключение в C #? [Дубликат]

Я немного искал поисковую систему, и я нашел следующий пример кода ( http://osdir.com/ml/python.matplotlib.general/2005-04/msg00044.html ):

def ema(s, n):
    """
    returns an n period exponential moving average for
    the time series s

    s is a list ordered from oldest (index 0) to most
    recent (index -1)
    n is an integer

    returns a numeric array of the exponential
    moving average
    """
    s = array(s)
    ema = []
    j = 1

    #get n sma first and calculate the next n period ema
    sma = sum(s[:n]) / n
    multiplier = 2 / float(1 + n)
    ema.append(sma)

    #EMA(current) = ( (Price(current) - EMA(prev) ) x Multiplier) + EMA(prev)
    ema.append(( (s[n] - sma) * multiplier) + sma)

    #now calculate the rest of the values
    for i in s[n+1:]:
        tmp = ( (i - ema[j]) * multiplier) + ema[j]
        j = j + 1
        ema.append(tmp)

    return ema

425
задан Tim Post 21 November 2013 в 05:48
поделиться

7 ответов

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

throw;

при печати трассировки, следующей "из броска исключая" Вы будете видеть, что это заканчивается на том операторе а не в реальном источнике исключения.

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

746
ответ дан Torbjörn Gyllebring 21 November 2013 в 05:48
поделиться
  • 1
    Спасибо, I' ve добавил схему выше для разъяснения. В основном it' s наложение компонентов друг на друге (z индекс) это I' m не уверенный в. – Pool 12 May 2009 в 13:20

Мои предпочтения должны использовать

try 
{
}
catch (Exception ex)
{
     ...
     throw new Exception ("Put more context here", ex)
}

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

151
ответ дан RB. 21 November 2013 в 05:48
поделиться
  • 1
    О, хорошо я вижу, моя ошибка. Спасибо за дополнительное разъяснение. – AlbertoPL 12 May 2009 в 13:48

При выдаче исключения с переменная (второй пример), StackTrace будет включать исходный метод, который выдал исключение.

В первом примере StackTrace будет изменен для отражения существующего метода.

Пример:

static string ReadAFile(string fileName) {
    string result = string.Empty;
    try {
        result = File.ReadAllLines(fileName);
    } catch(Exception ex) {
        throw ex; // This will show ReadAFile in the StackTrace
        throw;    // This will show ReadAllLines in the StackTrace
    }
35
ответ дан funkwurm 21 November 2013 в 05:48
поделиться
  • 1
    Спасибо, поскольку я понимаю это, которое это показало бы Внутренней рамке, которая будет иметь стиль окна. Мне действительно нужно полное удовлетворение требованиям заказчика, которое предложила бы панель. – Pool 12 May 2009 в 13:45

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

Поэтому первое БЕЗУСЛОВНО лучше.

22
ответ дан Quibblesome 21 November 2013 в 05:48
поделиться

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

4
ответ дан Mendelt 21 November 2013 в 05:48
поделиться

Это зависит. В отладочная сборка, я хочу видеть исходное отслеживание стека с как можно меньшим усилием. В этом случае, "бросок"; отвечает всем требованиям. В сборке конечных версий, однако, (a) я хочу зарегистрировать ошибку с исходным отслеживанием стека, включенным, и как только это сделано, (b) повторно сформируйте обработку ошибок, чтобы иметь больше смысла пользователю. Здесь "Выдают Исключение", имеет смысл. Это верно, что перебросок ошибки отбрасывает исходное отслеживание стека, но неразработчик ничего не вытаскивает из наблюдения информации трассировки стека, таким образом, это должно хорошо повторно бросить ошибку.

        void TrySuspectMethod()
        {
            try
            {
                SuspectMethod();
            }
#if DEBUG
            catch
            {
                //Don't log error, let developer see 
                //original stack trace easily
                throw;
#else
            catch (Exception ex)
            {
                //Log error for developers and then 
                //throw a error with a user-oriented message
                throw new Exception(String.Format
                    ("Dear user, sorry but: {0}", ex.Message));
#endif
            }
        }

путь вопрос сформулирован, сложив "Бросок": по сравнению с "Броском исключая"; делает его определенным отвлекающим маневром. Реальный выбор между "Броском"; и "Выдают Исключение", где "Бросок исключая"; маловероятный особый случай, "Выдают Исключение".

3
ответ дан John Saunders 21 November 2013 в 05:48
поделиться

Вы всегда должны использовать "throw;" для отбрасывания исключений в .NET,

См. это, http://weblogs.asp.net/bhouse/archive/2004/11/30/272297.aspx

В основном MSIL (CIL) имеет две инструкции - "throw" и "rethrow", и "throw ex;" C# компилируется в "throw" MSIL, а "throw;" C# - в "rethrow" MSIL! В принципе, я вижу причину, по которой "throw ex" отменяет трассировку стека.

8
ответ дан 22 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

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