Страницы

Поиск по вопросам

Показаны сообщения с ярлыком обработка-ошибок. Показать все сообщения
Показаны сообщения с ярлыком обработка-ошибок. Показать все сообщения

воскресенье, 9 февраля 2020 г.

Зачем нужно пробрасывать исключения?

#java #исключения #методы #обработка_ошибок


Зачем нужно пробрасывать исключения? Почему может быть нельзя из сразу обработать?
    


Ответы

Ответ 1



Чтобы обрабатывать ошибки централизованно. Вот допустим у Вас есть процесс, который разбирает определенные файлы и кладет их в базу данных. Файлы большие и сложные, поэтому логика разбита по сотне-другой классов, в каждом из которых по несколько методов. Драйвер базы данных предусматривает, что база может оказаться недоступна и все методы, которые работают с БД выбрасывают DatabaseKaputException. Т.к. разработчики драйвера фанатики, с садисткими наклонностями DatabaseKaputException — проверяемое исключение. Теперь, если все исключения обрабатывать на месте, то каждый метод, работающий с БД будет содержать try/catch: public Result someMethod() { try{ //получаем результат из БД } catch(DatabaseException de) { //а вдруг база упала? } } Проблема с таким подходом в том, что «низовые» классы понятия не имеют, что им делать если база умерла. В этом случае нужно перейти к самому верхнему классу и останавливать весь процесс. Поэтому если исключения не пробрасывать, то каждый метод должен будет определять какой-то код ошибки и передавать его вверх. public ResultWithException someMethod() { ResultWithException result; try{ //нормальный код result.setValue(...); } catch(DatabaseException de) { //Обрабатываем, возвращаем результат с ошибкой result.setError(...); } } И при каждом вызове метода нужно будет проверять не оборвался ли он: ResultWithException result = someObj.someMethod(); //а ты точно выполнился? if(result.getError()==null) { //передаем сообщение об ошибке наверх } В результате получится тот же механизм пробрасывания исключений, только самописный и более многословный. Пробрасывание позволяет обрабатывать исключение в том классе, который может принять адекватное решение по ошибке. При этом такого класса может и не быть. Если приложение работает с БД напрямую, то не всегда оправданно писать для него удобную систему обработки ошибок подключения. В таком случае исключение можно пробросить на самый верх. В принципе есть языки программирования (C, Rust) которые обрабатывают ошибки в основном через возвращаемые значения (коды ошибок, специальные типы). В Java для этого как правило используются исключения. Проверяемые исключения как раз и являются попыткой обязать разработчиков обрабатывать ошибки.

пятница, 31 января 2020 г.

Как правильно формировать сообщения об ошибке для пользователя?

#исключения #обработка_ошибок


Здравствуйте, коллеги!
Поделитесь пожалуйста опытом, какими правилами вы пользуетесь когда формируете сообщение
об ошибке для пользователя при написании ПО.
К примеру пользователь пытается что то загрузить из сети и положить результат в БД.
Соответственно могут произойти ошибки как связанные с сетью, так и с БД. Т.е. я бы
сказал пользователю следующее (к примеру):


Не удалось загрузить список должностей: Нет доступа к сети Интернет
Не удалось загрузить список должностей: Client error 404 not found
Не    удалось загрузить список должностей: Server error 500
Не удалось    загрузить список должностей: Ошибка записи в БД


P.S можно ли выводить сообщение из пойманого exception? 

Спасибо за Ваши ответы!
    


Ответы

Ответ 1



Поставьте себя на место пользователя, который не знаком с программированием, Вам интересно читать "Client error 404 not found", "Server error 500"? Для такого пользователя эти 504 Gateway Timeout, как абракадабра. Его по сути должно волновать, когда эта проблема будет устранена и как продолжить работать с вашей программой. Так вот, предположим пропало соединение с базой данных, тогда пользователю надо вывести сообщение: "Операция сохранения данных завершилась неудачей в связи с техническими проблемами на нашей стороне. Попробуйте через несколько минут." Если у пользователя пропал интернет, тогда это немного другая ошибка и она должна показывать не только наличие того, что пропал интернет, но и краткую информацию, как эту проблему можно решить. Может быть его firewall заблокировал? "Мы заметили, что у Вас пропало соединение с интернетом. Работа в режиме Offline с нашей программой невозможна, проверьте соединение с интернетом. Если вы не наблюдаете проблем с открытием страниц в браузере, возможно, доступ к сети мог был заблокирован вашим антивирусным ПО для нашей программы и Вам требуется проверить правила" Также, можно внизу сделать вкладку "Системная информация" и туда сохранить информацию об ошибке, данные запроса и т.д. и написать пользователю: "Если данная проблема сохраняется в течении длительного времени, обратитесь в техническую поддержку с информацией из вкладки 'системная информация'"

Ответ 2



«Пишите приложение так, будто поддерживать его будет склонный к насилию психопат, знающий, где вы живёте» (с) не моя. Пользователи бывают разные по квалификации, в организациях с вашим сообщением об ошибке будет работать минимум два человека — собственно, пользователь и сотрудник техподдержки, поэтому надо, чтобы сообщение было полезно им обоим (да и вам самим на этапе отладки). Посмотрите, как организован журнал сообщений в Windows — там есть краткое описание ошибки в одну строчку, которое показывается в списке, и подробное с кучей информации, понятной разве что разработчику. И рекомендую почитать классическую статью Якоба Нильсена «Правила написания сообщений об ошибках» (Jakob Nielsen, «Error Message Guidelines»).

Ответ 3



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

среда, 22 января 2020 г.

Какие есть способы предупреждения ошибок, их нахождения и устранения?

#отладка #любой_язык #обработка_ошибок


При разработке часто могут возникать разного рода ошибки, а у меня нет знаний о том
как и с помощью чего можно было бы их обнаруживать или упреждать. Даже мелкие ошибки.
Поэтому часто задаю вопросы в формате "Где ошибка в коде?" на разных ресурсах, вместо
того, чтобы самостоятельно всё исправить.

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

Спасибо.
    


Ответы

Ответ 1



Мой ответ будет про IDE. IDE (англ. Integrated Development Environment - Интегрированная среда разработки). Их очень много. Например часто используют: для c# — Visual Studio для javascript — WebStorm, NetBeans, Eclipse, Brackets, Sublime и т.д. для php — PHPStorm, NetBeans, Eclipse и т.д. для java — Intellij IDEA для других языков еще что-то В IDE много бесконечных возможностей, например: детектор дублируемого кода рефакторинг инструменты для работы с базами данных интеграция с системами управления версиями автодополнение кода подсветка синтаксиса подсказки при наборе кода (функции, ключевые слова, переменные, которые объявлял ранее) и многое другое Как это поможет? Среда знает, что она редактирует код и знает язык, на котором написан код. В неё встроен синтаксический анализатор языка программирования. Еще на самом первом этапе написания кода она может показать строки с банальными (и не только) ошибками, но которые уже могут привести к нерабочему или неправильно функционирующему коду. IDE показывает номер строки кода, где предположительно ошибка; краткое и полное описание ошибки, которое можно прочитать, проанализировать и исправить. Ошибки показываются как на боковой панели, так и в самом редакторе еще на этапе написания, а для компилируемых языков еще и в консоли при запуске программы. Примеры: Visual Studio Intellij IDEA WebStorm и PHPStorm Можно сразу видеть: уровень ошибки (предупреждение, уведомление, ошибка) полный текст ошибки в каком файле номер строки, на которой ошибка Можно перейти в скрипт на указанную строку и проанализировать. Не знаете английский? Откройте любой онлайн переводчик и скопируй туда текст ошибки заменив заглавные буквы на строчные: C# CS0103 The name 'getSum' does not exist in the current context ConsoleApp2017 C:\VS\ConsoleApp2017\Program.cs 6 Имя «getSum» не существует в текущем контексте ConsoleApp2017 в файле C:\VS\ConsoleApp2017\Program.cs На линии №6 Не может найти метод getSum в классе Program.cs на линии 6. Значит вызов есть, а объявления нет и искать надо в указанном направлении. Java Error:(34, 9) java: cannot find symbol symbol: method getSum() location: class test.Test Ошибка: (34, 9) java: не удается найти символ Символ: метод getSum () Местоположение: класс test.Test и так далее. Исправлять желательно все ошибки, как минимум уровня опасности "красный". warning и notice могут быть временно забыты, например сообщение о неиспользованной переменной, которую вы точно намерены потом использовать. Но в итоге надо починить их все! В IDE еще много полезных и не упомянутых возможностей. Для их использования: - определись с языком, подбери нужную IDE и изучай.

пятница, 3 января 2020 г.

Средства и методы нахождения ошибок в коде их исправления. Сборник

#отладка #любой_язык #обработка_ошибок #faq


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

В вопросы, перечисленные ниже в списке МОЖНО и нужно добавлять еще ответы!

Метки пишем в алфавитном порядке. 



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

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


"Что не так в коде?"
"Где у меня ошибка?"
"Почему программа не работает?"
и подобные

    


Ответы

Ответ 1



Общие практики и советы Какие есть способы предупреждения ошибок, их нахождения и устранения? Список по языкам c# Как и какими средствами находить ошибки в коде на C#? java Как и какими средствами находить ошибки в коде Java? javascript Как и какими средствами находить ошибки в Javascript коде? php Как и какими средствами находить ошибки в PHP коде? css Что делать, если не работает css-класс

понедельник, 30 декабря 2019 г.

При обновлении сайта выдает `alert`

#javascript #html #css #обработка_ошибок


При обновлении или загрузке сайта, выдает alert.  

Как его убрать?


    


Ответы

Ответ 1



Давайте его искать: Открываем исходный код страницы - правой кнопкой, Просмотр кода страницы CTRL+F - ищем alert( - не находим Смотрим, какие внешние скрипты подключаются Это можно сделать вручную, либо F12-Sources-js Видим в Maine_Js.js на строке 219: alert( 'Текущая прокрутка сверху: ' + window.pageYOffset ); Уберите его из этого файла на сервере.

Ответ 2



Если проект развернут локально: Открываем IDE CTRL+F по проекту Вводим в диалоговое окно alert Находим, где вызывается это диалоговое окно и удаляем. Если проект не развернут локально: Инспектируем подключение скриптов на сайте F12-Sources-js. Или же ищем прямо на хостинге. Находим alert и убираем его. Если не находим в JS, пробуем искать прямо в разметке. Если подключаются внешние скрипты: Может быть, что alert вызывается из внешней библиотеки, которую вы подключаете через CDN. Тогда советовал бы скопировать её к себе на сервер и откорректировать согласно рекомендациям выше. Или же вообще задаться вопросом - а нужна ли она вам?

пятница, 13 декабря 2019 г.

Как исправить? 'int' object is not subscriptable

#python #python_3x #обработка_ошибок


Вот задача:
Сгенерировать 20 случайных целых чисел в диапазоне от -5 до 4, записать их в ячейки
массива. Посчитать сколько среди них положительных, отрицательных и нулевых значений.
Вывести на экран элементы массива и посчитанные количества.
Вот текст ошибки:
a[i]=int(a[i])
TypeError: 'int' object is not subscriptable.
Как ето исправить?Большое Спасибо! 

import random
a=[]
for i in range(20):
      a=random.randint(-5,4)
p=[]
n=[]
z=[]
for i in range(20):
     a[i]=int(a[i])
     for i  in range(0,20,1):
            if(a[i]>0):
                p.append(a[i])
            if(a[i]==0):
                z.append(a[i])

            if (a[i]<0):
               n.append(a[i])


print('quantity positive',len(p))
print('quantity negative',len(n))
print('quantity zero',len(z))

    


Ответы

Ответ 1



В 4й строчке вы записываете в переменную "a" целое число: a=random.randint(-5,4) Затем, в 9й строчке вы пытаетесь обратиться к переменной "a" по индексу. a[i]=int(a[i]) Но целочисленные переменные не умеют в индекс. Чтобы всё заработало, вам нужно заменить 4ю строчку на такое: a.append(random.randint(-5,4)) А вообще, ваш код не слишком питоничен. Там где это возможно, рекомендуется вместо циклов использовать списковые включения. Они гораздо более лаконичны, и код с ними становится гораздо проще, чем без них. Вашу программу можно переписать таким образом: import random a = [random.randint(-5,4) for _ in range(20)] p = [i for i in a if i > 0] n = [i for i in a if i < 0] z = [i for i in a if i == 0] print('quantity positive', len(p)) print('quantity negative', len(n)) print('quantity zero', len(z)) Как видите, получилось гораздо понятнее, чем у вас. PS: Признаком хорошего стиля считается ставить пробелы слева и справа от "равно", знаков сравнения и арифметических символов. А также пробел после запятой.

среда, 27 ноября 2019 г.

Как и какими средствами находить ошибки в PHP коде?

#php #отладка #обработка_ошибок #php_faq


При разработке, порой, код не работает так, как задумано или вообще не работает.
Сижу, гадаю: что и где не так?

Час посмотрев на код - иду на проф. ресурсы, например Stack Overflow и публикую вопрос
 "Где здесь ошибка?" или "Почему не работает?"

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

Вопрос: какие есть способы, чтобы найти ошибки в PHP коде? Какие инструменты, методы,
плагины, пути и пр.? 
    


Ответы

Ответ 1



Вчера всё работало, а сегодня не работает / Код не работает как задумано или Debugging (Отладка) В чем заключается процесс отладки? Что это такое? Процесс отладки состоит в том, что мы останавливаем выполнения скрипта в любом месте, смотрим, что находится в переменных, в функциях, анализируем и переходим в другие места; ищем те места, где поведение отклоняется от правильного. Будет рассмотрен пример с PHPStorm, но отладить код можно и в любой другой IDE. Подготовка Для начала необходимо, чтобы в PHP имелась библиотека для отладки под названием xdebug. Если её еще нет, то надо скачать на xdebug.org. Обычно все библиотеки лежат в папке ext внутри папки PHP. Туда и надо поместить dll. Далее в php.ini прописываем настройки: [Xdebug] zend_extension="C:/server/php/ext/php_xdebug.dll" //