О чем Вы думаете, “Не ловят непредвиденные исключительные ситуации” лучшая практика?

Ну, у вас есть несколько вариантов. Первое решение, которое сработало для меня, было ggplot / geom_flow:

# requires(ggplot2)
# requires(ggalluvial)

# faking the data for 20 patients
set.seed(42)
individual <- as.character(rep(1:20,each=5))
timeperiod <- paste0(rep(c(0, 18,36,54,72),20),"_week")
therapy <- factor(sample(c("Etanercept", "Infliximab", "Rituximab",  "Adalimumab","Missing"), 100, replace=T))
d <- data.frame(individual, timeperiod, therapy)
head(d)

# Plotting it
ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
  scale_fill_brewer(type = "qual", palette = "Set2") +
  geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") +
  geom_stratum() +
  theme(legend.position = "bottom") +
  ggtitle("Treatment across observation period")

enter image description here

Аргумент stat = "alluvium" в [ 116] должно позволять отслеживать отдельных пациентов, но если вы хотите, вы также можете объединить потоки:

ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
  scale_fill_brewer(type = "qual", palette = "Set2") +
  geom_flow(color = "darkgray") +
  geom_stratum() +
  theme(legend.position = "bottom") +
  ggtitle("Treatment across observation period")

enter image description here [1114]

[1131 ] РЕДАКТИРОВАТЬ 1 : Если вы хотите, чтобы у некоторых пациентов поток прекратился (например, терапия завершилась), вы можете легко сделать это, установив этих пациентов как NA:

# setting 3 pantients as NA for the last timepoint
d[which(d$individual==3 & d$timeperiod=="72_week"), ]["therapy"] <- NA 
d[which(d$individual==6 & d$timeperiod=="72_week"), ]["therapy"] <- NA 
d[which(d$individual==9 & d$timeperiod=="72_week"), ]["therapy"] <- NA 

# making the plot:
ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
scale_fill_brewer(type = "qual", palette = "Set2") +
geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") + 
geom_stratum(alpha=0.75) +
theme(legend.position = "bottom") +
ggtitle("Treatment across observation period")

[ 1119] enter image description here Теперь, если честно, networkD3 сработал, но мне просто не удалось заставить его выглядеть достаточно хорошо.

РЕДАКТИРОВАТЬ 2 :

  • Вы также можете использовать geom_alluvium вместо geom_flow. Основное (визуальное) различие между ними заключается в том, что в geom_flow цвет потока наследуется от соседних узлов (либо источника, либо цели). В geom_alluvium он вместо этого наследуется от первого узла - например, Поток не изменит цвет при прохождении через узлы.

  • Если вы хотите объединить график с другим графиком, проще всего было бы использовать par(mfrow=c(1,2)).

7
задан Community 23 May 2017 в 11:47
поделиться

13 ответов

Это - вопрос Устойчивости, которая продолжает работать даже в случае необъяснимых ошибок, по сравнению с Правильностью, предпочитая перестать работать полностью, а не привести к ненадежным результатам.

Очевидно, если Вы продолжаете работать, например, системы жизнеобеспечения, Вы не хотите, чтобы Ваша система просто закрылась из-за неизвестного состояния ошибки. Cotninuing для работы, даже если состояние не четко определено, вероятно, лучше, чем завершение.

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

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

13
ответ дан 6 December 2019 в 08:45
поделиться

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

1
ответ дан 6 December 2019 в 08:45
поделиться

"Есть ли что-то, что я пропускаю здесь?"

Да.

"Есть ли известные лучшие практики (кроме 'никогда стратегия' непредвиденной исключительной ситуации выгоды'?)"

Да. Инкапсуляция. Выделение Ответственности. S. O. L. Я. Принципы D.

Лучше поймать исключение в LoadCustomer () метод, повторно бросить 'CustomerLoadException' оттуда и поймать CustomerLoadException вместо всего Исключения в коде вызова?

Да. Это инкапсулирует все вещи, которые могут пойти не так, как надо в определении класса, которое обеспечивает loadCustomer метод.

2
ответ дан 6 December 2019 в 08:45
поделиться

Я думаю, что это зависит от сценария, но как правило я только ловлю исключение, которое я ожидаю к occure посредством повседневного использования приложения и использую своего рода unhandeled инструмент создания отчетов/входа исключения, такой как здоровье, контролирующее для ASP.NET. Однако, если это - критическая часть приложения, которое просто не может иметь unhandeled исключения, я ловлю все исключения и снова сообщаю/регистрирую о них.

2
ответ дан 6 December 2019 в 08:45
поделиться
Я определенно предпочитаю иметь свой сервер с небольшим неизвестным побочным эффектом на одном клиенте, а не моем целом сервере вниз.

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

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

1
ответ дан 6 December 2019 в 08:45
поделиться

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

Если веб-страница бросает необработанное исключение, Вы думаете "meh" и поражаете обновление. Если настольное приложение бросает один, Вы могли бы потерять некоторые данные и довольно раздражаетесь. Если сервер бросает один, Ваш целый бизнес мог бы снизиться, пока он не фиксируется.

Это также зависит от того, как легкий это должно исправить - если для Вас легко продвинуть патч ко всем установкам (таким как Ваш собственный сервер или внутреннее приложение), могло бы быть лучше оставить исключение непойманным. Если Вы пишете что-то, что не может быть исправлено (игра для более старой консоли или встроенного приложения устройства) затем, Вы могли бы лучше глотать исключение.

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

1
ответ дан 6 December 2019 в 08:45
поделиться

Я не очень опытен в этой области. Однако кажется мне что: 1. Существуют некоторые исключения почти к любому правилу. Знание, когда нарушить правило, важно. 2. В случае обработки исключений это почти никогда не хорошая идея поймать исключения вслепую. Это вызвано тем, что можно фиксировать некоторые действительно неожиданные ошибки.

Например, в Python (2.5.2, по крайней мере), ловя вслепую позволит мне ловить сигнал ctrl+c (Linux). Что означает, что я не могу завершить приложение в чрезвычайной ситуации.

  1. Для Вашего кода веб-сервера можно хотеть сделать одно из следующих
    +Use пользовательское исключение, которое выдается, если клиенту не удается загрузить и регистрировать/исправлять это.
    Обработка исключений +Use на более глубоком уровне кода и дескриптора это там.
0
ответ дан 6 December 2019 в 08:45
поделиться

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

Это действительно лучше?

0
ответ дан 6 December 2019 в 08:45
поделиться

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

      foreach (string CustomerID in Customers)
            try
            {
                LoadCustomer(CustomerID);
            }
            catch (Exception ex) // blind catch of all exceptions
            {
                if (ex is OutOfMemoryException || ex is StackOverflowException ||...)
                     throw;
                // log the exception, and investigate later.

            }
0
ответ дан 6 December 2019 в 08:45
поделиться

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

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

0
ответ дан 6 December 2019 в 08:45
поделиться

Это зависит от того, где Вы стоите. Если Вы находитесь на низком уровне, большинство исключений, которые можно предвидеть и необходимо явно поймать только их и отъезд остальных пузырь. К тому времени, когда Вы добираетесь до GUI или высокоуровневой логики, все известное исключение было бы поймано, и Вы закончите только с непредвиденными исключительными ситуациями. Теперь у Вас есть 2 опции:

  1. Пессимистическое представление: покажите исключение и сдайтесь.
  2. Оптимистическое представление: Вы уверены, что уже поймали все исключения критика, таким образом, Вы глотаете исключение и продолжаете (ON ERROR RESUME NEXT, кто-либо?)

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

На конце это, "все зависит" ситуация. Что хуже? Продолжая неправильные данные или выходя неожиданно? Действительно ли это - критическая система? Это, произвел используемый другой системой? и т.д., и т.д.

Так или иначе все критическое исключение должно было быть поймано на более глубоких уровнях приложения.

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

0
ответ дан 6 December 2019 в 08:45
поделиться

Вы - прекрасная ловля alle Исключения (не Ошибки, хотя), когда Вы знаете, какие объекты и ресурсы могли бы быть затронуты и отбросить все те объекты.

Таким образом в Вашем случае Вы могли бы быть в порядке для обработки исключения, преобразовывающего целый процесс в noop. Но необходимо быть уверены что: - никакие другие совместно используемые ресурсы не являются affecte (например, Быть в спящем режиме Сессия, которая могла бы быть мертвой после исключения) - полное (сделка), действие отменяется не только половина из него. Это означает, что такая обработка исключений может только появиться в специальных местах, обычно непосредственно 'под' пользовательским интерфейсом. Пример: пользователь нажимает кнопку, которая, как предполагается, загружает клиента, изменяет ее адрес и сохраняет его снова. Когда любой из тех идет не так, как надо, можно поймать исключение, предотвращают все остающиеся шаги, чтобы произойти, выбросить клиента, возражают и представляют сообщение, в котором говорится: извините, не работал.

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

Таким образом, правило: определите слой где Вы контрольные сделки. Это должно быть слоем, который ловит Исключения. Мог быть SwingActions, могли быть Потоки, мог быть общедоступен пустой основной, мог быть в цикле как в Вашем примере.

0
ответ дан 6 December 2019 в 08:45
поделиться

Выявить исключения, о которых вы знаете, совершенно нормально. Вы можете ожидать в своем примере исключения NullObjectException. Это совершенно разумно.

Когда вы ловите общее исключение, вы, по сути, говорите: «Я не знаю, что пошло не так, или сервер горит, и мне все равно . " Хотя ваш сервер может продолжать работать, неизвестно, каким может быть внутреннее состояние или приведет ли это исключение к сбою в будущем.

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

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

1
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

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