Использование Класса исключений в c#

Я нашел это решение, чтобы найти элементы с полем массива, большим определенной длины

db.allusers.aggregate([
  {$match:{username:{$exists:true}}},
  {$project: { count: { $size:"$locations.lat" }}},
  {$match:{count:{$gt:20}}}
])

. Первый агрегат $ match использует аргумент, который истинен для всех документов. Если пусто, я получаю

"errmsg" : "exception: The argument to $size must be an Array, but was of type: EOO"
5
задан Stuart Helwig 21 September 2008 в 00:52
поделиться

6 ответов

Это просто немного ужасно.

Если Вы показываете ошибку конечному пользователю, пользователь, как предполагается, может действовать об этом. В "Списке имен клиента не мог быть отображен Ваш требуемый". случай, Ваш пользователь будет просто думать "и что?" На всех этих случаях, просто отображаться, "что-то плохо произошло" сообщение. Вы даже не должны ловить эти исключения, когда что-то разлагается, позвольте некоторому глобальному методу (как application_error), обрабатывают его и отображают универсальное сообщение. Когда Вы или Ваш пользователь сможете сделать что-то об ошибке, поймайте ее и сделайте вещь или уведомьте пользователя.

Но Вы захотите зарегистрировать каждую ошибку, которую Вы не обрабатываете.

Между прочим, отображение информации об ошибочном появлении может уступить уязвимостям системы обеспечения безопасности. Чем меньше взломщики знают о Вашей системе, тем менее вероятно они найдут способы взломать ее (помните те сообщения как "Синтаксическая ошибка в sql операторе: Выберите * От Пользователей Где имя пользователя ='a'; база данных drp; - '..." ожидаемый: 'отбрасывание' вместо 'drp'. Они не делают сайты как они больше).

9
ответ дан 18 December 2019 в 06:24
поделиться

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

Но ожидайте минута! Если код платформы или библиотека, которой Вы пользуетесь, выдают исключение затем, вещи уже отклеиваются. У Вас есть нефункциональные требования для того, как быстро сообщение об ошибке распространено после исключения?Вряд ли. Это - действительно грандиозное предприятие? Что-то непредвиденное и 'исключительное' произошло. Главное состоит в том, чтобы представить разумную, полезную информацию пользователю.

Я думаю, что Вы на правильном пути с тем, что Вы делаете.

3
ответ дан 18 December 2019 в 06:24
поделиться

Это является технически дорогостоящим для выдачи новых исключений, однако я не сделаю большие дебаты, из которых с тех пор "дорогостоящий" относительно - если Вы выдадите 100 таких исключений в минуту, то Вы не будете, вероятно, видеть стоимость; при выдаче 1 000 таких исключений в секунду очень хорошо можно видеть хит производительности (следовательно, не действительно стоящий обсуждения здесь - производительность является вызовом).

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

  • Что-то Вы на самом деле хотите совместно использовать со своим пользователем?
  • Что-то Ваш пользователь сможет интерпретировать, понять и использовать?
  • Записанный таким способом, которым это не вмешается в более позднее повторное использование компонентов низкого уровня, утилита которых не могла бы быть известна, когда они были записаны?

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

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

Я начал бы первым решением, если бы существует действительно семантическое различие между выданным исключением Платформы и сообщением об исключении, требуется обеспечить пользователю. Если существует, то идите вперед и используйте пользовательское исключение на самом низком уровне ('вход в систему, отказавший' в Вашем примере). Шаги после этого, до фактической презентации исключения, действительно не требуют никаких пользовательских исключений. Исключение, которым Вы интересуетесь, было уже сгенерировано (вход в систему перестал работать) - продолжающий переноситься, то сообщение на каждом уровне стека вызовов не служит никакой реальной цели кроме представления Вашего стека вызовов Вашим пользователям. Для тех "средних" шагов, принимая любые блоки попытки/выгоды существуют, простой 'журнал и бросок' стратегия хорошо работали бы.

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

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

Вот несколько достойных статей о лучших практиках обработки исключений:

http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

http://aspalliance.com/1119

Здорово это стало многословным... извинения заранее.

8
ответ дан 18 December 2019 в 06:24
поделиться

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

2
ответ дан 18 December 2019 в 06:24
поделиться

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

1
ответ дан 18 December 2019 в 06:24
поделиться

Где я работаю, у нас есть только несколько причин поймать исключения. Мы только делаем это когда...

  1. Мы можем делать с этим что-то - например, Мы знаем, что это может иногда происходить, и мы можем исправить его в коде, как это происходит (очень редкое).

  2. Мы хотим знать, что это происходит и где (затем мы просто повторно бросаем исключение).

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

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

  1. Мы хотим подавить исключение полностью и продолжать идти. Само собой разумеется, мы только делаем это для типов ожидаемого исключения и только когда нет никакого другого способа обнаружить условие, которое генерирует исключение.
2
ответ дан 18 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

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