Nano Hash - криптовалюты, майнинг, программирование

Asp.net — лучшее место для перехвата ошибок SQL Server SQL

Для веб-приложений Asp.net лучше всего:

  1. перехватывать ошибки в хранимых процедурах sql и проверять возвращаемое значение в коде или
  2. просто позвольте ошибке возникнуть в sql (не обрабатывайте ее) и полагайтесь на то, что ado.net вызовет ошибки в коде.

Каковы лучшие практики здесь?

06.11.2008

Ответы:


1

Общее правило, которое применяется здесь, состоит в том, чтобы поймать ошибку как можно ближе к источнику. SQL Server теперь имеет синтаксис перехвата ошибок "try... catch...". Так что используйте его. Накладные расходы на небольшой дополнительный код незначительны, и если у вас есть несколько операторов в SP, вы можете адаптировать строку в RAISERROR, чтобы помочь локализовать проблему.

В интерфейсе не должно быть сложно перехватить событие ошибки SP и обработать его так же, как вы обрабатываете другие перехваты ошибок в своем процедурном коде.

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

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

06.11.2008
  • Также нашел полезную информацию здесь, 4guysfromrolla.com/webtech/041906-1.shtml. 07.11.2008

  • 2

    Согласно этой статье, это тип "тупоголового" исключения - т.е. если в SP возникает ошибка, это означает, что что-то не так с SP или самими данными.

    Я бы посоветовал ловить ошибку в aps.net, так как там у вас гораздо больше возможностей для регистрации ошибки, а также всех параметров, переданных в SP для исследования проблемы.

    06.11.2008
  • я бы сказал, что этот тип исключения является экзогенным или фатальным. sproc может выйти из строя, например, из-за отсутствия данных или из-за отказа сети. Но ваш совет правильный: всегда ловите ошибку в коде asp.net 06.11.2008
  • Разрыв соединения — это не ошибка SP, а ошибка кода вызова. SP следует создавать тщательно, чтобы не создавать исключений при отсутствии данных. Или, с другой стороны, это может быть сигналом к ​​несогласованности данных. В любом случае, это нужно исправить. 06.11.2008
  • @Sunny: почему sproc не должен вызывать ошибку, если отсутствуют важные данные? Разве вы не хотели бы знать, если клиент № 123 внезапно исчезнет в середине обновления счета? 06.11.2008
  • если клиент пропадает посреди обновления, то правильная блокировка скорее всего отсутствует. или, если бизнес-логика допускает это, то это не ошибка, а ожидаемое поведение, и его следует обрабатывать должным образом. но... у каждого свой стиль, как информировать о таком состоянии. 06.11.2008
  • Я просто высказал свое мнение, как бы я справился с этим и почему. 06.11.2008

  • 3

    Я использую try/catch для всех потенциально ошибочных вызовов библиотек или других серверов, включая запросы к базе данных. Я в первую очередь разработчик, а не администратор базы данных, поэтому я обрабатываю ошибки на языке, в котором я лучше всего разбираюсь, C #, а не в SQL. Я уверен, что это будет варьироваться для каждого программиста. Не обрабатывать ошибку никогда не бывает хорошо в моей книге.

    06.11.2008

    4

    Я предпочитаю оба -

    • хранимая процедура вызывает RAISEERROR, что проявляется как исключение в ADO.NET.
    • хранимая процедура возвращает код ошибки, если одна sproc вызывает другую

    в общем, я всегда делаю вызовы db внутри try-catch

    06.11.2008

    5

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

    06.11.2008

    6

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

    06.11.2008

    7

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

    Имейте в виду, что иногда вы можете пропустить ошибки при использовании sql server 2005 try/catch, см. message">мой пост об этом. Принимая во внимание, что в коде (в моем случае C#) вы можете получить доступ ко всем ошибкам в объекте SqlErrorCollection.

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

    06.11.2008

    8

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

    Помимо ошибок, рекомендуется получать и обрабатывать сообщения от ядра СУБД SQL Server. Они очень похожи на ошибки и могут дать приложению много полезной диагностической информации. Если вы используете System.Data.SQLClient, вам потребуется создать делегат SqlInfoMessageEventHandler, определяющий метод, обрабатывающий событие, для прослушивания события InfoMessage в классе SqlConnection. Вы обнаружите, что информация о контексте сообщения, такая как серьезность и состояние, передается в качестве аргументов функции обратного вызова, потому что с точки зрения системы эти сообщения подобны ошибкам. Надеюсь, это поможет!

    06.11.2008
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..