Я немного искал поисковую систему, и я нашел следующий пример кода ( 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
Необходимо всегда использовать следующий синтаксис, чтобы повторно бросить исключение, еще Вы затопчете отслеживание стека:
throw;
при печати трассировки, следующей "из броска исключая" Вы будете видеть, что это заканчивается на том операторе а не в реальном источнике исключения.
В основном, это нужно считать уголовным преступлением для использования "броска исключая".
Мои предпочтения должны использовать
try
{
}
catch (Exception ex)
{
...
throw new Exception ("Put more context here", ex)
}
, Это сохраняет исходную ошибку, но позволяет Вам помещать больше контекста, такого как идентификатор объекта, строка подключения, материал как этот. Часто мой инструмент создания отчетов исключения будет иметь 5 цепочечных исключений для создания отчетов, каждый сообщающий о большем количестве детали.
При выдаче исключения с переменная (второй пример), 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
}
Первые консервы исходное отслеживание стека исключения, второе заменяет его текущим местоположением.
Поэтому первое БЕЗУСЛОВНО лучше.
Первое лучше. При попытке отладить второе, и смотреть на стек вызовов Вы не будете видеть, куда исходное исключение прибыло из. Существуют приемы для сохранения стека вызовов в целости (попробуйте поиск, ему ответили прежде), если действительно необходимо повторно бросить.
Это зависит. В отладочная сборка, я хочу видеть исходное отслеживание стека с как можно меньшим усилием. В этом случае, "бросок"; отвечает всем требованиям. В сборке конечных версий, однако, (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
}
}
путь вопрос сформулирован, сложив "Бросок": по сравнению с "Броском исключая"; делает его определенным отвлекающим маневром. Реальный выбор между "Броском"; и "Выдают Исключение", где "Бросок исключая"; маловероятный особый случай, "Выдают Исключение".
Вы всегда должны использовать "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" отменяет трассировку стека.