Я полностью согласен с г-ном Колином Т. Бауэрсом, что MATHEMATICA делает нормировку так, что последнее значение EigenVectors становится единым. Используя MATLAB, если кто-то хочет получить результат EigenVectors, как MATHEMATICA, тогда мы можем сказать MATLAB. Нормализовать последнее значение результата EigenVectors на 1, используя следующий шаг нормализации.
M = [1, 2, 3; 4, 5, 6; 7, 8, 9];
[EigVec, EigVal] = eig(M);
sf=1./EigVec(end,:); %get the last value of each eigen vector and inverse for scale factor
sf=repmat(sf,size(EigVec,1),1); % Repeat Scale value of each element in the vector
Normalize_EigVec=EigVec.*sf;
Normalize_EigVec =
0.2833 -1.2833 1.0000
0.6417 -0.1417 -2.0000
1.0000 1.0000 1.0000
Мы следуем
, не ловят исключения, если Вы не знаете, что сделать с ним.
Мы никогда не обрабатываем исключений, которые мы не можем обработать или значение по умолчанию. Это пузырится, и мы обрабатываем его на прикладном уровне.
Говорят, можно ли принять значение по умолчанию значение для бизнес-объекта, затем можно обработать его в бизнес-слое.
определенно поместите выгоду попытки, самую близкую к пользователю - потому что в том месте можно перевести ее во что-то значимое для пользователя.
Более глубокие выгоды попытки могли только быть необходимы, если Вы намереваетесь сделать что-то с ними - например, обработать исключение, или возможно зарегистрировать и повторно бросить исключение.
Молитва обработки исключений: "Бросьте рано, поймайте поздно". Вы хотите поймать исключения в прошлый момент, но Вы хотите бросить их сразу (не выполняйте набор больше обработки после определения, что что-то неправильно, и затем выдайте исключение). Если Вы не можете "обработать" исключение, то не ловите его.
При большинстве обстоятельств, Попытке... Наконец блоки должны быть намного более распространены в Вашем коде, чем Попытка... Выгода.
Вероятно, лучше всего использовать выгоду попытки во всех слоях, но только тихо поймать исключения в уровне UI. В бизнесе и уровнях доступа к данным необходимо, вероятно, поймать исключение и записать информацию, прежде, чем повторно бросить, например,
try
{
//do something
}
catch(Exception ex)
{
LogFile.WriteLine(ex.ToString());
throw;
}
Примечание: не пишите:
throw ex;
, поскольку это очистит все полезные данные стека от исключения.
Всегда пробуйте/ухватывайтесь верхний уровень или contoller уровень.
Это просто зависит от того, где Вы на самом деле хотите делать с этим что-то. Обычно я ловлю его в бизнес-слое, и затем регистрирую его и возможно вызываю некоторую ui функцию для отображения сообщения пользователю.
я рассматриваю, что сделать с ошибками бизнес-правило. Это должно быть отдельным от слоя данных или ui слоя.
Поместите выгоду попытки, где Вы уверены, что будете только глотать исключение. Несколько блоков try-catch в различных слоях могут быть в порядке, если можно гарантировать непротиворечивость.
, Например, можно поместить выгоду попытки в уровень доступа к данным, чтобы гарантировать, чтобы Вы очистили соединения правильно. Но поскольку Вы не можете сделать намного больше там, необходимо, вероятно, повторно бросить исключение.
Перемещение в бизнес-слой, можно поместить выгоду попытки через несколько операций базы данных, которые Вы хотите продолжить двигаться атомарно. В этом случае, можете быть Вы, должен откатывать все или поместить вещи в согласованное состояние, зарегистрировать исключение где-нибудь. Глотание или перебросок должны быть решены об индивидуальном основании.
Ваш уровень представления должен всегда ловить все исключения, быть этим некоторое веб-приложение, сценарий, работающий в браузере или некотором приложении толстого клиента. Вы не можете понимать исключение полностью, но по крайней мере можно удостовериться, что приложение не умирает перед лицом пользователя.
, Конечно, его просто совет. YMMV. :)
Общий ответ был бы: поймайте каждый раз, когда можно обработать то, что бросается. Таким образом, решение довольно просто. Например, поймайте исключения, которые возникают при создании объекта, в котором Вы нуждаетесь.
UI только для презентации. Вы не ловите исключения там, потому что выяснение, что сделать с ним, означает логику. Это принадлежит слоев контроллера или бизнеса. В худшем случае Вы ловите исключение и отображаете его на соответствующее, удобное для пользователя сообщение об ошибке, которое затем отправляется в презентацию для дисплея.
Когда у меня есть многослойная архитектура как это (который является много), у меня часто будет пробование/ухватывание больше чем одного слоя. Например, попытка/выгода в слое персистентности, который ловит SQLException, делает то, что должен сделать слой персистентности (как, уведомляют администратора, например) затем выдает новое исключение, которое будет иметь смысл к некоторому коду, который называет слой персистентности. Примером мог бы быть PersistenceException. Следующий слой не заботится о том, кто должен быть уведомлен для перезапущения базы данных, но это заботится, что не могло сохранить пользовательское состояние, таким образом, это могло бы поймать PersistenceException и сказать пользователю, что его новый номер телефона не был сохранен в базе данных.
Вы только хотите использовать выгоды попытки для управления необработанным кодом. Пример, у меня есть COM-объект, которым я общаюсь с, и я не хочу, чтобы он остался открытым и создал утечку памяти. Другая приемлемая альтернатива должна зафиксировать ошибки на событиях в Вашей базе данных прежде, чем позволить исключению продолжаться.
Вы никогда не хотите использовать выгоды попытки для обработки ситуаций, где Вы не уверены, Вы кодируете, будет работать и хотеть план резервного копирования.
Поэтому, где это оставляет Вас, когда приложения аварийно завершаются, используйте пользовательские ошибочные страницы, чтобы указать, что проблема произошла в Ваших веб-приложениях и для кода синтаксического анализа толстых клиентов прочь в рабочие потоки, таким образом, они не аварийно завершают Ваш основной поток, если они перестали работать.Удачи!