Отсутствует что-то простое с Java-кодом
Начинающий Java-студент здесь. Я пытаюсь создать программу средней оценки учащегося, которая останавливается, когда добавляется дозорное значение «999». Вот что у меня есть:
У меня проблема в том, что 999 добавляются к средним значениям, и я не могу понять, какое простое решение. Спасибо!
5 ответов
Ваша проблема заключается в том, что код в операторе else (который добавляет значение к средним значениям) запускается до проверки того, является ли значение дозорным.
Простое исправление может быть:
Есть и другие способы добиться этого, но порядок того, что должно произойти:
- получить значение оценки ученика, введенное пользователем
- проверить, установлено ли сигнальное значение; если да то сломай
- проверить, действительно ли значение; если нет, повторите шаги 2-3
- добавить значение к среднему расчету
EDIT: чтобы решить эту проблему с ограничением, что break нельзя использовать (согласно запросу @baash05 в комментариях), сделайте следующее:
Этот код не использует операторы break, но все же выполняет правильный порядок того, что должно произойти.
Это не проблема Java. Это скорее проблема повторения с использованием while. Вы можете основывать свою логику на следующем псевдокоде:
Вот ваша программа, основанная на приведенном выше p-коде:
Не выполняйте расчеты по сигнальному значению. Добавьте условие в else , чтобы этого не произошло.
Кроме того, рассмотрите возможность определения константы для этого сигнального значения. В классе:
Простое решение — добавить условие if в условие else. Вы можете найти изменение в следующем коде:
Такой близкий друг
Я просто переместил запрос в состояние while. Он проверит введенное значение перед запуском тела оператора while.
Другие указали на некоторые мелочи, которые вы могли бы исправить. Нравится 999 как константа. хорошая идея. магические числа (необработанные числа в коде) чаще всего являются плохой идеей. Подумайте, что будет означать 999 для психопата, который в конечном итоге будет поддерживать ваш код. Он узнает, где вы живете, и выследит вас, если вы не облегчите ему работу.
Также ознакомьтесь с условиями Yoda. Если вы новичок и войдете в привычку, это избавит вас от кучи боли.
Что отсутствует в следующем коде
Найдите ошибки в следующем коде Первая заключается в том, что используется тип unsigned int , который работает только со значениями, большими или равными нулю. Поэтому… Подробнее » Что отсутствует в следующем коде
Что получится если переставить буквы в сочетании жксопдинне
- автор: administrator
- 08.08.2022
Составить слово из букв ЖКСОПДИННЕ — Анаграмма к слову ЖКСОПДИННЕ Решение анаграммы к слову ЖКСОПДИННЕ, слова из букв Ж К С О П Д И… Подробнее » Что получится если переставить буквы в сочетании жксопдинне
Что произойдет при нажатии клавиши enter если курсор находится
- автор: administrator
- 08.08.2022
Что произойдёт при нажатии клавиши Enter, если курсор находится внутри абзаца? Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах. Как… Подробнее » Что произойдет при нажатии клавиши enter если курсор находится
Что с tor
- автор: administrator
- 08.08.2022
Свободный доступ. Tor Browser изолирует каждый загружаемый сайт: трекеры третьих сторон и рекламщики не могут вас отслеживать. История посещений и куки-файлы автоматически сбрасываются по окончании… Подробнее » Что с tor
Что означает двоеточие в программировании
- автор: administrator
- 08.08.2022
Двоеточие Двоеточие — знак препинания в виде двух, расположенных одна над другой, точек ( : ) , употребляемый для указания на то, что часть текста после… Подробнее » Что означает двоеточие в программировании
Найдите ошибки в следующем коде
Первая заключается в том, что используется тип unsigned int , который работает только со значениями, большими или равными нулю. Поэтому условие цикла for всегда будет истинно, и цикл будет выполняться бесконечно.
Корректный код, выводящий значения всех чисел от 100 до 1, должен использовать условие i > 0 . Если нам на самом деле нужно вывести нулевое значение, то следует добавить дополнительный оператор printf после цикла for .
Вторая ошибка — вместо %d следует использовать %u , поскольку мы выводим целые значения без знака.
Теперь этот код правильно выведет список чисел от 100 до 1, в убывающем порядке.
Разбор взят из книги Гейл Л. Макдауэлл «Cracking the Coding Interview» (есть в переводе).
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.
Что отсутствует в следующем коде
Следующий код работает с браузером Firefox, но onClick не работает с Chrome и Safari.
Что-то отсутствует в следующем коде. Если кто-нибудь может помочь, чтобы он мог работать с кросс-браузером.
onClick не работает с Chrome и Safari, но отлично работает с Firefox — Pujan
1 ответы
хорошо onclick кажется есть некоторые проблемы с webkit, попробуйте связать populate с onchange
ответ дан 07 дек ’11, 07:12
@PujanSrivastava, вам нужно включить onchange select и не option вот так jsfiddle.net/Ka3YK/3 — Саржа
Но как вызывать разные JS-функции на разных тег. — Пуджан
если вы посмотрите на jsFiddle, вы увидите, что есть this в вызове заполнения просто сделайте что-то вроде populate(e) , и вы получите необходимую информацию, если вам нужна дополнительная помощь, начните новый вопрос — Саржа
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками javascript web or задайте свой вопрос.
Отсутствует что-то простое с кодом Java
Начинающий ученик на Java здесь. Я пытаюсь создать среднюю программу для ученика, которая останавливается, когда добавляется дозорное значение «999». Вот что у меня есть:
У меня проблема в том, что 999 добавляется в средние, и я не могу понять, каково простое решение. Спасибо!
5 ответов
Ваша проблема в том, что код в else оператор (который добавляет значение к средним значениям) выполняется перед проверкой того, является ли значение часовым.
Простое исправление может быть:
Есть и другие способы достижения этого, но порядок того, что должно произойти:
- получить значение для студенческой оценки, введенной пользователем
- проверить, является ли значение дозорного; если так, сломай
- проверить правильность значения; если нет, повторите шаги 2-3
- добавить значение к среднему расчету
РЕДАКТИРОВАТЬ: решить эту проблему с ограничением, которое break нельзя использовать (по запросу @baash05 в комментариях), выполните следующие действия:
Этот код не использует операторы break, но все еще выполняет правильный порядок того, что должно произойти.
Это не проблема Java. Это скорее проблема повторения, использующая while. Вы можете основывать свою логику на следующем псевдокоде:
Вот ваша программа на основе приведенного выше p-кода:
Простое решение — добавить условие if в ваше условие else. Вы можете найти изменения в следующем коде:
Не выполняйте расчеты по дозорному значению. Добавить условие к вашему else чтобы не допустить этого.
Также рассмотрите возможность определения константы для этого дозорного значения. В классе:
Очень близкий друг
Я просто переместил запрос в условие while. Он проверит введенное значение перед запуском тела while
Другие указали на некоторые мелочи, которые вы могли бы исправить. Как 999 как константа. отличная идея. магические числа (сырые числа в коде) чаще всего плохая идея. Подумайте, что 999 будет значить для психопата, который в конечном итоге будет поддерживать ваш код. Он узнает, где вы живете, и выследит вас, если вы не упростите его работу.
Также ознакомьтесь с условиями Йода. Если вы новичок и привыкли, это избавит вас от кучи боли.
Что отсутствует в следующем коде
Первая заключается в том, что используется тип unsigned int , который работает только со значениями, большими или равными нулю. Поэтому условие цикла for всегда будет истинно, и цикл будет выполняться бесконечно.
Корректный код, выводящий значения всех чисел от 100 до 1, должен использовать условие i > 0 . Если нам на самом деле нужно вывести нулевое значение, то следует добавить дополнительный оператор printf после цикла for .
Вторая ошибка — вместо %d следует использовать %u , поскольку мы выводим целые значения без знака.
Теперь этот код правильно выведет список чисел от 100 до 1, в убывающем порядке.
Ошибка в коде
name = input(«Введите имя: «)
age = input(«Введите свой возраст: «)
god = input(«Введите какой сейчас год: «)
age1 = 77
kgd = god — age + 77
print(«Привет » + name + «!», end=’ ‘)
print(«Тебе исполнится 77 лет в » + kgd + » году!»)
Программа выщитывает год в котором тебе исполнится 77 лет которая может работать хоть до 3-х тысячного года. ( ну лан хватит хвастаться )
Запускаю и тут ошибка
Traceback (most recent call last):
File «###», line 5, in
kgd = str(god — age + 77)
TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’
Вобщем решил добавить str
kgd = str(god — age + 77)
Но всё таже ошибка.
Кто сможет помочь и объяснить что тут не так.
Спасибо!
Найдите и исправьте ошибки в коде на Python: отладка с IDLE

Выявление ошибок называется дебаггингом, а дебаггер – помогающий понять причину их появления инструмент. Умение находить и исправлять ошибки в коде – важный навык в работе программиста, не пренебрегайте им.
IDLE (Integrated Development and Learning Environment) – кроссплатформенная интегрированная среда разработки и обучения для Python, созданная Гвидо ван Россумом.
Используйте окно управления отладкой
Основным интерфейсом отладки в IDLE является специальное окно управления (Debug Control window). Открыть его можно, выбрав в меню интерактивного окна пункт Debug→Debugger.
Примечание: если отладка отсутствует в строке меню, убедитесь, что интерактивное окно находится в фокусе.
Всякий раз, когда окно отладки открыто, интерактивное окно отображает [DEBUG ON].
Обзор окна управления отладкой
Чтобы увидеть работу отладчика, напишем простую программу без ошибок. Введите в редактор следующий код:
Сохраните все, откройте окно отладки и нажмите клавишу F5 – выполнение не завершилось.
Окно отладки будет выглядеть следующим образом:

Обратите внимание, что панель в верхней части окна содержит сообщение:
Расшифруем: код for i in range(1, 4): еще не запущен, а ‘__main__’.module() сообщает, что в данный момент мы находимся в основном разделе программы, а не в определении функции.
Ниже панели стека находится панель Locals, в которой перечислены непонятные вещи: __annotations__, __builtins__, __doc__ и т. д. – это внутренние системные переменные, которые пока можно игнорировать. По мере выполнения программы переменные, объявленные в коде и отображаемые в этом окне, помогут в отслеживании их значений.
В левом верхнем углу окна расположены пять кнопок: Go, Step, Over, Out и Quit – они управляют перемещением отладчика по коду.
В следующих разделах вы узнаете, что делает каждая из этих кнопок.
Кнопка Step
Нажмите Step и окно отладки будет выглядеть следующим образом:

Обратите внимание на два отличия. Во-первых, сообщение на панели стека изменилось:
На этом этапе выполняется line 1 и отладчик останавливается перед выполнением line 2.
Во-вторых – новая переменная i со значением 1 на панели Locals . Цикл for в line 1 создал переменную и присвоил ей это значение.
Продолжайте нажимать кнопку Step, чтобы пройтись по коду строка за строкой, и наблюдайте, что происходит в окне отладчика. Когда доберетесь до строки print(f»i is and j is «) , сможете увидеть вывод, отображаемый в интерактивном окне по одному фрагменту за раз.
Здесь важно, что можно отслеживать растущие значения i и j по мере прохождения цикла for. Это полезная фича поиска источника ошибок в коде. Знание значения каждой переменной в каждой строке кода может помочь точно определить проблемную зону.
Точки останова и кнопка Go
Часто вам известно, что ошибка должна всплыть в определенном куске кода, но неизвестно, где именно. Чтобы не нажимать кнопку Step весь день, установите точку останова, которая скажет отладчику запускать весь код, пока он ее не достигнет.
Точки останова сообщают отладчику, когда следует приостановить выполнение кода, чтобы вы могли взглянуть на текущее состояние программы.
Чтобы установить точку останова, щелкните правой кнопкой мыши (Ctrl для Mac) по строке кода, на которой хотите сделать паузу, и выберите пункт Set Breakpoint – IDLE выделит линию желтым. Чтобы удалить ее, выберите Clear Breakpoint.
Установите точку останова в строке с оператором print(). Окно редактора должно выглядеть так:

Сохраните и запустите. Как и раньше, панель стека указывает, что отладчик запущен и ожидает выполнения line 1. Нажмите кнопку Go и посмотрите, что произойдет:

Теперь на панели стека информация о выполнении line 3:
На панели Locals мы видим, что переменные i и j имеют значения 1 и 2 соответственно. Нажмем кнопку Go и попросим отладчик запускать код до точки останова или до конца программы. Снова нажмите Go – окно отладки теперь выглядит так:

На панели стека отображается то же сообщение, что и раньше – отладчик ожидает выполнения line 3. Однако значения переменных i и j теперь равны 2 и 4. Интерактивное окно также отображает выходные данные после первого запуска строки с помощью функции print() через цикл.
Нажмите кнопку в третий раз. Теперь i и j равны 3 и 6. Если нажать Go еще раз, программа завершит работу.
Over и Out
Кнопка Over работает, как сочетание Step и Go – она перешагивает через функцию или цикл. Другими словами, если вы собираетесь попасть в функцию с помощью отладчика, можно и не запускать код этой функции – кнопка Over приведет непосредственно к результату ее выполнения.
Аналогично если вы уже находитесь внутри функции или цикла – кнопка Out выполняет оставшийся код внутри тела функции или цикла, а затем останавливается.
В следующем разделе мы изучим некоторые ошибки и узнаем, как их исправить с помощью IDLE.
Борьба с багами
Взглянем на « глючную » программу.
Следующий код определяет функцию add_underscores(), принимающую в качестве аргумента строковый объект и возвращающую новую строку – копию слова с каждым символом, окруженным подчеркиванием. Например, add_underscores(«python») вернет «_p_y_t_h_o_n_» .
Вот неработающий код:
Введите этот код в редактор, сохраните и нажмите F5. Ожидаемый результат – _h_e_l_l_o_, но вместо этого выведется o_.
Если вы нашли, в чем проблема, не исправляйте ее. Наша цель – научиться использовать для этого IDLE.
Рассмотрим 4 этапа поиска бага:
- предположите, где может быть ошибка;
- установите точку останова и проверьте код по строке за раз;
- определите строку и внесите изменения;
- повторяйте шаги 1-3, пока код не заработает.
Шаг 1: Предположение
Сначала вы не сможете точно определить местонахождение ошибки, но обычно проще логически представить, в какой раздел кода смотреть.
Обратите внимание, что программа разделена на два раздела: определение функции add_underscores() и основной блок, определяющий переменную со значением «hello» и выводящий результат.
Посмотрим на основной раздел:
Очевидно, что здесь все хорошо и проблема должна быть в определении функции:
Первая строка создает переменную new_word со значением «_». Промах, проблема находится где-то в теле цикла for.
Шаг 2: точка останова
Определив, где может быть ошибка, установите точку останова в начале цикла for, чтобы проследить за происходящим внутри кода:

Запустим. Выполнение останавливается на строке с определением функции.
Нажмите кнопку Go, чтобы выполнить код до точки останова:

Код останавливается перед циклом for в функции add_underscores(). Обратите внимание, что на панели Locals отображаются две локальные переменные – word со значением «hello», и new_word со значением «_»,
Нажмите кнопку Step, чтобы войти в цикл for. Окно отладки изменится, и новая переменная i со значением 0 отобразится на панели Locals:

Переменная i – это счетчик для цикла for, который можно использовать, чтобы отслеживать активную на данный момент итерацию.
Нажмите кнопку Step еще раз и посмотрите на панель Locals – переменная new_word приняла значение «h_»:

Это неправильно т. к. сначала в new_word было значение «_», на второй итерации цикла for в ней должно быть «_h_». Если нажать Step еще несколько раз, то увидим, что в new_word попадает значение e_, затем l_ и так далее.
Шаг 3: Определение ошибки и исправление
Как мы уже выяснили – на каждой итерации цикла new_word перезаписывается следующим символом в строке «hello» и подчеркиванием. Поскольку внутри цикла есть только одна строка кода, проблема должна быть именно там:
Код указывает Python получить следующий символ word, прикрепить подчеркивание и назначить новую строку переменной new_word. Это именно то неверное поведение, которое мы наблюдали.
Чтобы все починить, нужно объединить word[i] + » _» с существующим значением new_word. Нажмите кнопку Quit в окне отладки, но не закрывайте его. Откройте окно редактора и измените строку внутри цикла for на следующую:
Примечание: Если бы вы закрыли отладчик, не нажав кнопку Quit, при повторном открытии окна отладки могла появиться ошибка:
You can only toggle the debugger when idle
Всегда нажимайте кнопку Go или Quit, когда заканчиваете отладку, иначе могут возникнуть проблемы с ее повторным запуском.
Шаг 4: повторение шагов 1-3, пока ошибка не исчезнет
Сохраните изменения в программе и запустите ее снова. В окне отладки нажмите кнопку Go, чтобы выполнить код до точки останова. Понажимайте Step несколько раз и смотрите, что происходит с переменной new_word на каждой итерации – все работает, как положено. Иногда необходимо повторять этот процесс несколько раз, прежде чем исправится ошибка.
Альтернативные способы поиска ошибок
Использование отладчика может быть сложным и трудоемким, но это самый надежный способ найти ошибки в коде. Однако отладчики не всегда есть в наличии. В подобных ситуациях можно использовать print debugging для поиска ошибок в коде. PD задействует функцию print() для отображения в консоли текста, указывающего место выполнения программы и состояние переменных.
Например, вместо отладки предыдущего примера можно добавить следующую строку в конец цикла for:
Измененный код будет выглядеть следующим образом:
Вывод должен выглядеть так:
PD работает, но имеет несколько недостатков по сравнению с отладкой дебаггером. Вы должны запускать всю программу каждый раз, когда хотите проверить значения переменных, а также помнить про удаление вызовов функций print().
Один из способов улучшить наш цикл – перебирать символы в word:
Заключение
Теперь вы знаете все об отладке с помощью DLE. Вы можете использовать этот принцип с различными дебагерами.
Что отсутствует в следующем коде
Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.
При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.
Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш "Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.
Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.
Ошибка компилятора
Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.
1. “… Expected”
Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.
Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:
- Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
- Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
- Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.
2. “Unclosed String Literal”
Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.
Обычно эта ошибка возникает в следующих ситуациях:
- Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
- Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
- Кавычки, являющиеся частью строки, не экранируются обратной косой чертой ("\").
3. “Illegal Start of an Expression”
Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.
Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.
4. “Cannot Find Symbol”
Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.
Сообщение об ошибке «Не удается найти символ» может иметь множество причин:
- Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
- Переменная никогда не объявлялась.
- Переменная не объявлена в той же области видимости.
- Никакие классы не импортируются.
5. “Public Class XXX Should Be in File”
Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.
Чтобы решить эту проблему, вы можете:
- Назовите класс и файл с тем же именем.
- Убедитесь, что два имени всегда совпадают.
6. “Incompatible Types”
«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.
Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:
- Используйте функции преобразования типов.
- Разработчикам может потребоваться изменить исходные функции кода.
7. “Invalid Method Declaration; Return Type Required”
Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.
Есть несколько ситуаций, которые вызывают ошибку "недопустимое объявление метода; требуется тип возвращаемого значения":
- Забыл объявить тип.
- Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
- Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.
8. “Method in Class Cannot Be Applied to Given Types”
Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.
При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.
9. “Missing Return Statement”
Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.
Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:
- Оператор возврата был опущен по ошибке.
- Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.
10. “Possible Loss of Precision”
Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.
Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:
- Попробуйте присвоить переменной целочисленного типа действительное число.
- Попробуйте присвоить данные типа double переменной целочисленного типа.
Основные типы данных в JavaОбъясняет характеристики различных типов данных.
11. “Reached End of File While Parsing”
Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка (">"). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.
Приведенный выше код приведет к следующей ошибке:
Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.
12. “Unreachable Statement”
Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.
Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。
13. “Variable Might Not Have Been Initialized”
Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.
14. “Operator … Cannot be Applied to ”
Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.
Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.
15. “Inconvertible Types”
Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».
Например, логические типы нельзя преобразовать в целые числа.
16. “Missing Return Value”
Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:
Возвращается следующая ошибка:
Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.
17. “Cannot Return a Value From Method Whose Result Type Is Void”
Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:
Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:
18. “Non-Static Variable … Cannot Be Referenced From a Static Context”
Эта ошибка возникает, когда компилятор пытается получить доступ к нестатической переменной в статическом методе:
Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:
- Вы можете объявить переменные статическими.
- Вы можете создавать экземпляры нестатических объектов в статических методах.
19. “Non-Static Method … Cannot Be Referenced From a Static Context”
Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:
Вызовет эту ошибку:
Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.
20. “(array) Not Initialized”
Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.
Следующий код правильный:
это тоже нормально:
Продолжение следует
Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.
Интеллектуальная рекомендация
Реализация JavaScript Hashtable
причина Недавно я смотрю на «Структуру данных и алгоритм — JavaScript», затем перейдите в NPMJS.ORG для поиска, я хочу найти подходящую ссылку на библиотеку и записывать его, я могу исполь.
MySQL общие операции
jdbc Транзакция: транзакция, truncate SQL заявление Transaction 100 000 хранимая процедура mysql msyql> -определить новый терминатор,Пробелов нет mysql>delimiter // mysql> -создание хранимой .
Используйте Ansible для установки и развертывания TiDB
жизненный опыт TiDB — это распределенная база данных. Настраивать и устанавливать службы на нескольких узлах по отдельности довольно сложно. Чтобы упростить работу и облегчить управление, рекомендуетс.
Последняя версия в 2019 году: использование nvm под Windows для переключения между несколькими версиями Node.js.
С использованием различных интерфейсных сред вы можете переключаться между разными версиями в любое время для разработки. Например, развитие 2018 года основано наNode.js 7x версия разработана. Тебе эт.
![]()
Шаблон проектирования — Создать тип — Заводской шаблон
Заводская модель фабрикиPattern Решать проблему: Решен вопрос, какой интерфейс использовать принципСоздайте интерфейс объекта, класс фабрики которого реализуется его подклассом, чтобы процесс создания.
Ошибки в макросе

Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.
Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.
Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.
Краткое руководство по обработке ошибок
| Пункт | Описание |
| On Error Goto 0 | При возникновении ошибки код останавливается и отображает ошибку. |
| On Error Resume Next | Игнорирует ошибку и продолжает. |
| On Error Goto [Label] | Переход к определенной метке при возникновении ошибки. Это позволяет нам справиться с ошибкой. |
| Err Object | При возникновении ошибки информация об ошибке сохраняется здесь. |
| Err.Number | Номер ошибки. (Полезно, только если вам нужно проверить, произошла ли конкретная ошибка.) |
| Err.Description | Содержит текст ошибки. |
| Err.Source | Вы можете заполнить это, когда используете Err.Raise. |
| Err.Raise | Функция, которая позволяет генерировать вашу собственную ошибку. |
| Error Function | Возвращает текст ошибки из номера ошибки. Вышло из употребления. |
| Error Statement | Имитирует ошибку. Вместо этого используйте Err.Raise. |
Введение
Обработка ошибок относится к коду, который написан для обработки ошибок, возникающих во время работы вашего приложения. Эти ошибки обычно вызваны чем-то вне вашего контроля, например отсутствующим файлом, недоступностью базы данных, недействительными данными и т.д.
Если мы считаем, что ошибка может произойти в какой-то момент, рекомендуется написать специальный код для обработки ошибки, если она возникнет, и устранить ее.
Для всех остальных ошибок мы используем общий код для их устранения. Это где оператор обработки ошибок VBA вступает в игру. Они позволяют нашему приложению корректно обрабатывать любые ошибки, которые мы не ожидали.
Чтобы понять обработку ошибок, мы должны сначала понять различные типы ошибок в VBA.

Ошибки VBA
В VBA есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Если вы использовали VBA в течение какого-то времени, вы увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return, VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.
Например, если вы введете If и забудете ключевое слово Then, VBA отобразит следующее сообщение об ошибке.

Некоторые примеры синтаксических ошибок
Синтаксические ошибки относятся только к одной строке. Они возникают, когда синтаксис одной строки неверен.
Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.
Ошибки компиляции
Ошибки компиляции происходят более чем в одной строке. Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.
Примеры ошибок компиляции:
- Оператор If без соответствующего оператора End If
- For без Next
- Select без End Select
- Вызов Sub или Function, которые не существуют
- Вызов Sub или Function с неверными параметрами
- Присвоение Sub или Function того же имени, что и для модуля
- Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)
На следующем снимке экрана показана ошибка компиляции, которая возникает, когда цикл For не имеет соответствующего оператора Next.

Использование Debug-> Compile
Чтобы найти ошибки компиляции, мы используем Debug-> Compile VBA Project из меню Visual Basic.
Когда вы выбираете Debug-> Compile, VBA отображает первую обнаруженную ошибку.
Когда эта ошибка исправлена, вы можете снова запустить Compile, и VBA найдет следующую ошибку.
Debug-> Compile также будет включать синтаксические ошибки в поиск, что очень полезно.
Если ошибок не осталось и вы запускаете Debug-> Compile, может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции в текущий момент.
Debug->Compile Error Summary
Debug-> Compile находит ошибки компиляции (проекта).
Он также найдет синтаксические ошибки.
Он находит одну ошибку каждый раз, когда вы ее используете.
Если нет ошибок компиляции, оставленная опция Компиляция будет отображаться серым цветом в меню.
Debug-> Compile Usage
Вы должны всегда использовать Debug-> Compile, прежде чем запускать свой код. Это гарантирует, что ваш код не будет иметь ошибок компиляции при запуске.
Если вы не запускаете Debug-> Compile, то VBA может обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками времени выполнения.
Ошибки во время выполнения
Ошибки во время выполнения возникают, когда ваше приложение работает. Обычно они находятся вне вашего контроля, но могут быть вызваны ошибками в вашем коде.

Например, представьте, что ваше приложение читает из внешней рабочей книги. Если этот файл будет удален, то VBA отобразит ошибку, когда ваш код попытается открыть его.
Другие примеры ошибок времени выполнения
- база данных недоступна
- пользователь вводит неверные данные
- ячейка, содержащая текст вместо числа
Как мы уже видели, целью обработки ошибок является обработка ошибок времени выполнения, когда они возникают.
Ожидаемые и неожиданные ошибки
Когда мы думаем, что может произойти ошибка во время выполнения, мы помещаем код на место для ее обработки. Например, мы обычно помещаем код на место, чтобы иметь дело с файлом, который не найден.
Следующий код проверяет, существует ли файл, прежде чем он пытается его открыть. Если файл не существует, отображается сообщение, удобное для пользователя, и код выходит из подпрограммы.
Когда мы думаем, что в какой-то момент может произойти ошибка, рекомендуется добавить код для обработки ситуации. Мы обычно называем эти ошибки ожидаемыми.
Если у нас нет специального кода для обработки ошибки, это считается неожиданной ошибкой. Мы используем операторы обработки ошибок VBA для обработки непредвиденных ошибок.
Ошибки времени выполнения, которые не являются ошибками VBA
Прежде чем мы рассмотрим VBA Handling, мы должны упомянуть один тип ошибок. Некоторые ошибки во время выполнения не рассматриваются как ошибки VBA, а только пользователем.
Позвольте мне объяснить это на примере. Представьте, что у вас есть приложение, которое требует, чтобы вы добавили значения в переменные a и b
Допустим, вы по ошибке используете звездочку вместо знака плюс
Это не ошибка VBA. Ваш синтаксис кода является совершенно законным. Однако, с вашей точки зрения, это ошибка.
Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время выполнения
- Ожидаемые ошибки — напишите конкретный код для их обработки.
- Неожиданные ошибки — используйте операторы обработки ошибок VBA для их обработки.
Оператор VBA On Error используется для обработки ошибок. Этот оператор выполняет некоторые действия при возникновении ошибки во время выполнения.
Есть четыре различных способа использовать это утверждение
- On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
- On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
- On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
- On Error Goto -1 — очищает текущую ошибку.
Давайте посмотрим на каждое из этих утверждений по очереди.
On Error Goto 0
Это поведение по умолчанию VBA. Другими словами, если вы не используете On Error, это поведение вы увидите.
При возникновении ошибки VBA останавливается на строке с ошибкой и отображает сообщение об ошибке. Приложение требует вмешательства пользователя с кодом, прежде чем оно сможет продолжить. Это может быть исправление ошибки или перезапуск приложения. В этом случае обработка ошибок не происходит.
Давайте посмотрим на пример. В следующем коде мы не использовали строку On Error, поэтому VBA будет использовать поведение On Error Goto 0 по умолчанию.
Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.

Когда появляется ошибка, вы можете выбрать End или Debug
Если вы выберете Конец, то приложение просто остановится.
Если вы выберете Отладить, приложение остановится на строке ошибки, как показано на скриншоте ниже.

Это нормально, когда вы пишете код VBA, поскольку он показывает вам точную строку с ошибкой.
Это поведение не подходит для приложения, которое вы передаете пользователю. Эти ошибки выглядят непрофессионально и делают приложение нестабильным.
Подобная ошибка, по сути, приводит к сбою приложения. Пользователь не может продолжить работу без перезапуска приложения. Они могут вообще не использовать его, пока вы не исправите для них ошибку.
Используя On Error Goto [label], мы можем дать пользователю более контролируемое сообщение об ошибке. Это также предотвращает остановку приложения. Мы можем заставить приложение работать предопределенным образом.
On Error Resume Next
Использование On Error Resume Next указывает VBA игнорировать ошибку и продолжать работу.
Есть конкретные случаи, когда это полезно. Большую часть времени вы должны избегать его использования.
Если мы добавим Resume Next к нашему примеру Sub, то VBA проигнорирует ошибку деления на ноль
Это не очень хорошая идея, чтобы сделать это. Если вы игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может повлиять на приложение несколькими способами. Вы можете получить неверные данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что вы подавили ошибку.
Приведенный ниже код является примером использования Resume Next.
В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все, что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.
В приведенном выше коде мы продолжаем, если есть ошибка. Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда значение этой переменной будет установлено равным Nothing.
Это пример того, когда Резюме может быть полезным. Дело в том, что, хотя мы используем Resume, мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не нужно будет использовать Resume.
On Error Goto [label]
Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на таких языках, как C # и Java.
При возникновении ошибки вы отправляете ошибку на определенный ярлык. Обычно это внизу саба.
Давайте применим это к подводной лодке, которую мы использовали
Снимок экрана ниже показывает, что происходит при возникновении ошибки.

VBA переходит на метку eh, потому что мы указали это в строке «Перейти к ошибке».
Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.
Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.
On Error Goto -1
Это утверждение отличается от других трех. Он используется для очистки текущей ошибки, а не для настройки конкретного поведения.
При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.
Это поведение относится только к текущей подпрограмме. Как только мы выйдем из саба, ошибка будет очищена автоматически.
Посмотрите на код ниже. Первая ошибка приведет к переходу кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.
Если мы добавим дальнейшую обработку ошибок, она не будет работать, поскольку ловушка ошибок не была очищена.
В коде ниже мы добавили строку
после того как мы поймаем первую ошибку.
Это не имеет никакого эффекта, так как ошибка не была очищена. Другими словами, код остановится на строке с ошибкой и отобразит сообщение.
Для устранения ошибки мы используем On Error Goto -1. Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам нужно установить ее снова.
В приведенном ниже коде мы добавляем эту строку, и вторая ошибка теперь приведет к переходу кода на метку eh_other.
Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.
Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.
Использование On Error
Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:
- Остановитесь и отобразите ошибку.
- Игнорируйте ошибку и продолжайте.
- Перейти к определенной строке.
VBA всегда будет настроен на одно из этих действий. Когда вы используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.
В следующем подпункте VBA изменяет поведение ошибки каждый раз, когда мы используем оператор On Error
Err объект
При возникновении ошибки вы можете просмотреть детали ошибки, используя объект Err.
При возникновении ошибки времени выполнения VBA автоматически заполняет объект Err деталями.
Приведенный ниже код выведет «Error Number: 13 Type Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в длинное целое число.
Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»
Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.
Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.
Получение номера строки
Функция Erl используется для возврата номера строки, где произошла ошибка.
Это часто вызывает путаницу. В следующем коде Erl вернет ноль.
Это потому, что нет номеров строк. Большинство людей не понимают этого, но VBA позволяет вам иметь номера строк.
Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.
Добавление номеров строк в код вручную затруднительно. Однако есть инструменты, которые позволят вам легко добавлять и удалять номера строк в подпрограмме.
Когда вы закончите работу над проектом и передадите его пользователю, в этот момент может быть полезно добавить номера строк. Если вы используете стратегию обработки ошибок в последнем разделе этого поста, то VBA сообщит строку, где произошла ошибка.
Использование Err.Raise
Err.Raise позволяет нам создавать ошибки. Мы можем использовать его для создания пользовательских ошибок для нашего приложения, что очень полезно. Это эквивалент оператора Throw в Java \ C #.
Давайте посмотрим на простой пример. Представьте, что мы хотим убедиться, что в ячейке есть запись длиной 5 символов. Мы могли бы иметь конкретное сообщение для этого
Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером, например
Использование Err.Clear
Err.Clear используется для очистки текста и чисел из объекта Err.Object. Другими словами, он очищает описание и номер.
Редко вам понадобится его использовать, но давайте рассмотрим пример, где вы могли бы.
В приведенном ниже коде мы подсчитываем количество ошибок, которые могут возникнуть. Для простоты мы генерируем ошибку для каждого нечетного числа.
Мы проверяем номер ошибки каждый раз, когда проходим цикл. Если число не равно нулю, то произошла ошибка. Как только мы посчитаем ошибку, нам нужно установить номер ошибки на ноль, чтобы он был готов проверить следующую ошибку.
Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.
Логирование
Ведение журнала означает запись информации из вашего приложения, когда оно запущено. При возникновении ошибки вы можете записать детали в текстовый файл, чтобы у вас была запись об ошибке.
Код ниже показывает очень простую процедуру регистрации
Вы можете использовать это так:
Журнал не только для записи ошибок. Вы можете записывать другую информацию во время работы приложения. При возникновении ошибки вы можете проверить последовательность событий до того, как произошла ошибка.
Ниже приведен пример регистрации. То, как вы реализуете журналирование, зависит от характера приложения и его полезности.
Наличие большого количества информации при работе с ошибкой может быть очень полезным. Часто пользователь может не дать вам точную информацию об ошибке, которая произошла. Глядя на журнал, вы можете получить более точную информацию об информации.
Другие элементы, связанные с ошибками
В этом разделе рассматриваются некоторые другие инструменты обработки ошибок, которые есть в VBA. Эти элементы считаются устаревшими, но я включил их, поскольку они могут существовать в устаревшем коде.
Функция ошибки
Функция Error используется для печати описания ошибки с заданным номером ошибки. Он включен в VBA для обеспечения обратной совместимости и не нужен, поскольку вместо него можно использовать описание Err.Description.
Ниже приведены некоторые примеры
Заявление об ошибке
Заявление об ошибке позволяет имитировать ошибку. Он включен в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
В следующем коде мы моделируем ошибку «Разделить на ноль».
Это утверждение включено в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
Простая стратегия обработки ошибок
Со всеми различными опциями вы можете быть озадачены тем, как использовать обработку ошибок в VBA. В этом разделе я покажу вам, как реализовать простую стратегию обработки ошибок, которую вы можете использовать во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит

Следующий код показывает простую реализацию этой стратегии
Это хороший способ реализации обработки ошибок, потому что
- Нам не нужно добавлять код обработки ошибок в каждую подпрограмму.
- Если возникает ошибка, то VBA корректно завершает работу приложения.
Полная стратегия обработки ошибок
Стратегия выше имеет один недостаток. Он не сообщает вам, где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы должны сделать это сами.
В этом разделе я собираюсь представить более полную стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и номера строки в случае возникновения ошибки.
* Стек — это список вспомогательных функций, которые использовались в данный момент при возникновении ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех подпрограммах.
- Когда происходит ошибка, обработчик ошибок добавляет подробности к ошибке и вызывает ее снова.
- Когда ошибка достигает самой верхней подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма показывает простое визуальное представление о том, что происходит, когда в Sub3 возникает ошибка

Единственная грязная часть этого — правильное форматирование строк. Я написал две подводные лодки, которые справляются с этим, поэтому он позаботится о вас.
Это две вспомогательные подводные лодки
Пример использования этой стратегии
Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Результат выглядит так

Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

Примечание: вы можете получить следующую ошибку при использовании этого кода:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at webmaster@progi.pro to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Найдите ошибки в следующем фрагменте кода: var firstName = prompt(«Введите имя»; «сюда»);
var lastName = promt(«Введите фамилию»);
int age = prompt(«Введите возраст»);
alert(Age);
язык js
По сути текст «Сюда» не нужен, а если нужен, то указывается через запятую.
2. Вторая строка пропущена буква «p». prompt
3. var вместо int. В js нет строгой типизации.
4. alert(age) — c маленькой буквы, т.к переменные Age и age — разные.
Что отсутствует в следующем коде
Начинающий Java-студент здесь. Я пытаюсь создать программу средней оценки учащегося, которая останавливается, когда добавляется дозорное значение «999». Вот что у меня есть:
У меня проблема в том, что 999 добавляются к средним значениям, и я не могу понять, какое простое решение. Спасибо!
5 ответов
Ваша проблема заключается в том, что код в операторе else (который добавляет значение к средним значениям) запускается до проверки того, является ли значение дозорным.
Простое исправление может быть:
Есть и другие способы добиться этого, но порядок того, что должно произойти:
- получить значение оценки ученика, введенное пользователем
- проверить, установлено ли сигнальное значение; если да то сломай
- проверить, действительно ли значение; если нет, повторите шаги 2-3
- добавить значение к среднему расчету
EDIT: чтобы решить эту проблему с ограничением, что break нельзя использовать (согласно запросу @baash05 в комментариях), сделайте следующее:
Этот код не использует операторы break, но все же выполняет правильный порядок того, что должно произойти.
Это не проблема Java. Это скорее проблема повторения с использованием while. Вы можете основывать свою логику на следующем псевдокоде:
Вот ваша программа, основанная на приведенном выше p-коде:
Не выполняйте расчеты по сигнальному значению. Добавьте условие в else , чтобы этого не произошло.
Кроме того, рассмотрите возможность определения константы для этого сигнального значения. В классе:
Простое решение — добавить условие if в условие else. Вы можете найти изменение в следующем коде:
Такой близкий друг
Я просто переместил запрос в состояние while. Он проверит введенное значение перед запуском тела оператора while.
Другие указали на некоторые мелочи, которые вы могли бы исправить. Нравится 999 как константа. хорошая идея. магические числа (необработанные числа в коде) чаще всего являются плохой идеей. Подумайте, что будет означать 999 для психопата, который в конечном итоге будет поддерживать ваш код. Он узнает, где вы живете, и выследит вас, если вы не облегчите ему работу.
Также ознакомьтесь с условиями Yoda. Если вы новичок и войдете в привычку, это избавит вас от кучи боли.
Отсутствует что-то простое с Java-кодом
Начинающий Java-студент здесь. Я пытаюсь создать программу средней оценки учащегося, которая останавливается, когда добавляется дозорное значение «999». Вот что у меня есть:
У меня проблема в том, что 999 добавляются к средним значениям, и я не могу понять, какое простое решение. Спасибо!
5 ответы
Ваша проблема в том, что код в else оператор (который добавляет значение к средним значениям) запускается перед проверкой того, является ли значение дозорным.
Простое исправление может быть:
Есть и другие способы добиться этого, но порядок того, что должно произойти:
- получить значение оценки ученика, введенное пользователем
- проверить, установлено ли сигнальное значение; если да то сломай
- проверить, действительно ли значение; если нет, повторите шаги 2-3
- добавить значение к среднему расчету
EDIT: решить это с ограничением, которое break нельзя использовать (согласно запросу @baash05 в комментариях), сделайте следующее:
Этот код не использует операторы break, но все же выполняет правильный порядок того, что должно произойти.
ответ дан 21 окт ’13, 17:10
Красиво и просто. Но для класса/домашней работы это нарушает структурированное программирование, потому что у него есть разрыв, а проверка выхода во время выполнения должна быть в управлении циклом. — baash05
просто получите логическую переменную вне цикла, для которой установлено значение true и используется в условии while, а внутри условия 999 установите для логического значения значение false. — Manny265
@ baash05 добавил пример переноса теста для выхода while в управление циклом — Hunteros
Это не проблема Java. Это скорее проблема повторения с использованием while. Вы можете основывать свою логику на следующем псевдокоде:
Вот ваша программа, основанная на приведенном выше p-коде:
ответ дан 04 окт ’13, 00:10
Не выполняйте расчеты по сигнальному значению. Добавьте условие в свой else чтобы этого не произошло.
Кроме того, рассмотрите возможность определения константы для этого контрольного значения. В классе:
ответ дан 03 окт ’13, 23:10

Простое решение — добавить условие if в условие else. Вы можете найти изменение в следующем коде:
ответ дан 03 окт ’13, 23:10

такой близкий друг
Я просто переместил запрос в состояние while. Он проверит введенное значение перед запуском тела оператора while.
Другие указали на некоторые мелочи, которые вы могли бы исправить. Нравится 999 как константа. хорошая идея. магические числа (необработанные числа в коде) чаще всего являются плохой идеей. Подумайте, что будет означать 999 для психопата, который в конечном итоге будет поддерживать ваш код. Он узнает, где вы живете, и выследит вас, если вы не облегчите ему работу.
Также ознакомьтесь с условиями Yoda. Если вы новичок и войдете в привычку, это избавит вас от кучи боли.
ответ дан 03 окт ’13, 23:10
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками java or задайте свой вопрос.
Русские Блоги
Примечание переводчика: в этой статье представлены 20 распространенных ошибок компилятора Java. Каждая ошибка включает фрагменты кода, описания проблем и предоставляет ссылки по теме, которые помогут вам быстро понять и решить эти проблемы. Ниже приводится перевод.
При разработке программного обеспечения Java вы можете столкнуться со многими типами ошибок, но большинства из них можно избежать. Мы тщательно отобрали 20 наиболее распространенных ошибок программного обеспечения Java, включая примеры кода и руководства, которые помогут вам решить некоторые распространенные проблемы с кодированием.
Чтобы получить дополнительные советы и рекомендации по написанию программ на Java, вы можете загрузить наш "Comprehensive Java Developer’s Guide«Эта книга содержит все, что вам нужно, от всевозможных инструментов до лучших веб-сайтов и блогов, каналов YouTube, влиятельных лиц в Twitter, групп в LinkedIn, подкастов, мероприятий, которые необходимо посетить, и многого другого.
Если вы используете .NET, прочтите нашРуководство по 50 наиболее распространенным программным ошибкам .NETЧтобы избежать этих ошибок. Но если ваша текущая проблема связана с Java, прочтите следующую статью, чтобы понять наиболее распространенные проблемы и способы их решения.
Ошибка компилятора
Сообщения об ошибках компилятора создаются, когда компилятор выполняет код Java. Важно, что компилятор может выдавать несколько сообщений об ошибках для одной ошибки. Так что исправьте ошибку и перекомпилируйте, что может решить многие проблемы.
1. “… Expected”
Эта ошибка возникает, когда в коде чего-то не хватает. Обычно это происходит из-за отсутствия точки с запятой или закрывающей скобки.
Обычно это сообщение об ошибке не указывает точное местонахождение проблемы. Чтобы найти проблему, вам необходимо:
- Убедитесь, что все открывающие скобки имеют соответствующие закрывающие скобки.
- Посмотрите на код перед строкой, обозначенной ошибкой. Эта ошибка обычно обнаруживается компилятором в более позднем коде.
- Иногда некоторые символы (например, открывающая скобка) не должны быть первыми в коде Java.
2. “Unclosed String Literal”
Если в конце строки отсутствует кавычка, создается сообщение об ошибке «Незамкнутый строковый литерал», и это сообщение отображается в строке, где произошла ошибка.
Обычно эта ошибка возникает в следующих ситуациях:
- Строка не заканчивается кавычками. Это легко изменить, просто заключите строку в указанные кавычки.
- Строка превышает одну строку. Длинную строку можно разделить на несколько коротких строк и соединить знаком плюс («+»).
- Кавычки, являющиеся частью строки, не экранируются обратной косой чертой ("\").
3. “Illegal Start of an Expression”
Есть много причин для ошибки «Незаконное начало выражения». Это стало одним из наименее полезных сообщений об ошибках. Некоторые разработчики думают, что это вызвано плохим запахом кода.
Обычно выражение создается для генерации нового значения или присвоения значений другим переменным. Компилятор ожидает найти выражение, но посколькуГрамматика не оправдывает ожиданийВыражение не найдено. Эту ошибку можно найти в следующем коде.
4. “Cannot Find Symbol”
Это очень распространенная проблема, потому что все идентификаторы в Java должны быть объявлены до их использования. Эта ошибка возникает из-за того, что компилятор не понимает значения идентификатора при компиляции кода.
Сообщение об ошибке «Не удается найти символ» может иметь множество причин:
- Написание объявления идентификатора может не соответствовать написанию, используемому в коде.
- Переменная никогда не объявлялась.
- Переменная не объявлена в той же области видимости.
- Никакие классы не импортируются.
5. “Public Class XXX Should Be in File”
Если класс XXX и имя файла программы Java не совпадают, будет сгенерировано сообщение об ошибке «Открытый класс XXX должен быть в файле». Только когда имя класса и имя файла Java совпадают, код может быть скомпилирован.
Чтобы решить эту проблему, вы можете:
- Назовите класс и файл с тем же именем.
- Убедитесь, что два имени всегда совпадают.
6. “Incompatible Types”
«Несовместимые типы» — это логические ошибки, которые возникают, когда операторы присваивания пытаются сопоставить типы переменных и выражений. Обычно эта ошибка возникает при присвоении строки целому числу и наоборот. Это не синтаксическая ошибка Java.
Когда компилятор выдает сообщение «несовместимые типы», решить эту проблему действительно непросто:
- Используйте функции преобразования типов.
- Разработчикам может потребоваться изменить исходные функции кода.
7. “Invalid Method Declaration; Return Type Required”
Это сообщение об ошибке означает, что тип возвращаемого значения метода не объявлен явно в объявлении метода.
Есть несколько ситуаций, которые вызывают ошибку "недопустимое объявление метода; требуется тип возвращаемого значения":
- Забыл объявить тип.
- Если метод не имеет возвращаемого значения, вам необходимо указать «void» в качестве возвращаемого типа в объявлении метода.
- Конструктору не нужно объявлять тип. Однако, если в имени конструктора есть ошибка, компилятор будет рассматривать конструктор как метод без указанного типа.
8. “Method in Class Cannot Be Applied to Given Types”
Это сообщение об ошибке более полезно, оно означает, что метод был вызван с неправильными параметрами.
При вызове метода вы должны передать те параметры, которые определены в его объявлении. Пожалуйста, проверьте объявление метода и вызов метода, чтобы убедиться, что они совпадают.
9. “Missing Return Statement”
Когда в методе отсутствует оператор возврата, выдается сообщение об ошибке «Отсутствует оператор возврата». Метод с возвращаемым значением (тип, не являющийся недействительным) должен иметь оператор, который возвращает значение, чтобы значение можно было вызвать вне метода.
Есть несколько причин, по которым компилятор выдает сообщение «отсутствует оператор возврата»:
- Оператор возврата был опущен по ошибке.
- Метод не возвращает никакого значения, но тип не объявлен как недействительный в объявлении метода.
10. “Possible Loss of Precision”
Когда информация, присвоенная переменной, превышает верхний предел, который может нести переменная, выдается ошибка «Возможная потеря точности». Как только это произойдет, часть информации будет отброшена. Если это не проблема, переменную следует явно объявить в коде как новый тип.
Ошибка «возможная потеря точности» обычно возникает в следующих ситуациях:
- Попробуйте присвоить переменной целочисленного типа действительное число.
- Попробуйте присвоить данные типа double переменной целочисленного типа.
Основные типы данных в JavaОбъясняет характеристики различных типов данных.
11. “Reached End of File While Parsing”
Это сообщение об ошибке обычно появляется, когда в программе отсутствует закрывающая фигурная скобка (">"). Иногда эту ошибку можно быстро исправить, добавив закрывающую скобку в конце кода.
Приведенный выше код приведет к следующей ошибке:
Инструменты кодирования и правильные отступы кода могут упростить поиск этих несоответствующих фигурных скобок.
12. “Unreachable Statement”
Когда оператор появляется в месте, где он не может быть выполнен, выдается ошибка «Недоступный оператор». Обычно это делается после оператора break или return.
Обычно эту ошибку можно исправить, просто переместив оператор return. Прочтите эту статью:Как исправить ошибку «Недостижимый отчет»。
13. “Variable Might Not Have Been Initialized”
Если локальная переменная, объявленная в методе, не инициализирована, возникнет такая ошибка. Такая ошибка возникает, если вы включаете переменную без начального значения в оператор if.
14. “Operator … Cannot be Applied to ”
Эта проблема возникает, когда оператор действует с типом, который не входит в область его определения.
Эта ошибка часто возникает, когда код Java пытается использовать строковые типы в вычислениях (вычитание, умножение, сравнение размеров и т. Д.). Чтобы решить эту проблему, вам необходимо преобразовать строку в целое число или число с плавающей запятой.
15. “Inconvertible Types”
Когда код Java пытается выполнить недопустимое преобразование, возникает ошибка «Неконвертируемые типы».
Например, логические типы нельзя преобразовать в целые числа.
16. “Missing Return Value”
Если оператор возврата содержит неверный тип, вы получите сообщение «Отсутствует возвращаемое значение». Например, посмотрите на следующий код:
Возвращается следующая ошибка:
Обычно эта ошибка возникает из-за того, что оператор return ничего не возвращает.
17. “Cannot Return a Value From Method Whose Result Type Is Void”
Эта ошибка Java возникает, когда метод void пытается вернуть какое-либо значение, например, в следующем коде:
Обычно эту проблему может решить изменение типа возвращаемого значения метода, чтобы он соответствовал типу в операторе возврата. Например, следующий void можно изменить на int:
18. “Non-Static Variable … Cannot Be Referenced From a Static Context”
Эта ошибка возникает, когда компилятор пытается получить доступ к нестатической переменной в статическом методе:
Чтобы устранить ошибку «Нестатическая переменная… На нее нельзя ссылаться из статического контекста», можно сделать две вещи:
- Вы можете объявить переменные статическими.
- Вы можете создавать экземпляры нестатических объектов в статических методах.
19. “Non-Static Method … Cannot Be Referenced From a Static Context”
Эта проблема возникает, когда код Java пытается вызвать нестатический метод в статическом классе. Например, такой код:
Вызовет эту ошибку:
Чтобы вызвать нестатический метод в статическом методе, необходимо объявить экземпляр класса вызываемого нестатического метода.
20. “(array) Not Initialized”
Если массив был объявлен, но не инициализирован, вы получите сообщение об ошибке типа «(массив) не инициализирован». Длина массива фиксирована, поэтому каждый массив необходимо инициализировать требуемой длиной.
Следующий код правильный:
это тоже нормально:
Продолжение следует
Сегодня мы обсуждали ошибки компилятора, в следующий раз мы обсудим различные исключения времени выполнения, которые могут возникнуть. Как и структура этой статьи, в следующий раз она будет содержать фрагменты кода, пояснения и ссылки по теме, которые помогут вам исправить код как можно скорее.
Интеллектуальная рекомендация
javascript html js настраиваемое раскрывающееся меню многоуровневой связи, пользовательская связь выбора
где параметр 1 — это структура меню: Объект меню Параметр 2 — это выбранный набор идентификаторов (по порядку): Значение по умолчанию может быть установлено (по порядку): Источник: От: http://www.cnbl.
![]()
Navicat import .txt файл
Файл .txt, который необходимо импортировать в базу данных, показан на рисунке: Создайте таблицу на основе импортированного txt файла: Оптимизируйте файл .txt Примечание. Добавьте имена столбцов таблиц.
![]()
kafka
Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn) .
![]()
Безопасность в Интернете Нажмите, чтобы угнать
Нажмите на углубление, Clickjack Нажатие на технологию угона, также известная как интерфейсная камуфляжная атака, является методом визуального обмана. Злоумышленник использует один или несколько прозр.
IVIEW ЗАГРУЗИТЬ реализация ручной загрузки
В последнее время у меня есть проблема с функцией фоновой системы. Функциональный спрос Файл выбора формата файла Загрузить решение Сохранить файлы, которые должны быть загружены, отображаемое имя фай.
Ошибки в макросе

Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.
Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.
Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.
Краткое руководство по обработке ошибок
| Пункт | Описание |
| On Error Goto 0 | При возникновении ошибки код останавливается и отображает ошибку. |
| On Error Resume Next | Игнорирует ошибку и продолжает. |
| On Error Goto [Label] | Переход к определенной метке при возникновении ошибки. Это позволяет нам справиться с ошибкой. |
| Err Object | При возникновении ошибки информация об ошибке сохраняется здесь. |
| Err.Number | Номер ошибки. (Полезно, только если вам нужно проверить, произошла ли конкретная ошибка.) |
| Err.Description | Содержит текст ошибки. |
| Err.Source | Вы можете заполнить это, когда используете Err.Raise. |
| Err.Raise | Функция, которая позволяет генерировать вашу собственную ошибку. |
| Error Function | Возвращает текст ошибки из номера ошибки. Вышло из употребления. |
| Error Statement | Имитирует ошибку. Вместо этого используйте Err.Raise. |
Введение
Обработка ошибок относится к коду, который написан для обработки ошибок, возникающих во время работы вашего приложения. Эти ошибки обычно вызваны чем-то вне вашего контроля, например отсутствующим файлом, недоступностью базы данных, недействительными данными и т.д.
Если мы считаем, что ошибка может произойти в какой-то момент, рекомендуется написать специальный код для обработки ошибки, если она возникнет, и устранить ее.
Для всех остальных ошибок мы используем общий код для их устранения. Это где оператор обработки ошибок VBA вступает в игру. Они позволяют нашему приложению корректно обрабатывать любые ошибки, которые мы не ожидали.
Чтобы понять обработку ошибок, мы должны сначала понять различные типы ошибок в VBA.

Ошибки VBA
В VBA есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Если вы использовали VBA в течение какого-то времени, вы увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return, VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.
Например, если вы введете If и забудете ключевое слово Then, VBA отобразит следующее сообщение об ошибке.

Некоторые примеры синтаксических ошибок
Синтаксические ошибки относятся только к одной строке. Они возникают, когда синтаксис одной строки неверен.
Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.
Ошибки компиляции
Ошибки компиляции происходят более чем в одной строке. Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.
Примеры ошибок компиляции:
- Оператор If без соответствующего оператора End If
- For без Next
- Select без End Select
- Вызов Sub или Function, которые не существуют
- Вызов Sub или Function с неверными параметрами
- Присвоение Sub или Function того же имени, что и для модуля
- Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)
На следующем снимке экрана показана ошибка компиляции, которая возникает, когда цикл For не имеет соответствующего оператора Next.

Использование Debug-> Compile
Чтобы найти ошибки компиляции, мы используем Debug-> Compile VBA Project из меню Visual Basic.
Когда вы выбираете Debug-> Compile, VBA отображает первую обнаруженную ошибку.
Когда эта ошибка исправлена, вы можете снова запустить Compile, и VBA найдет следующую ошибку.
Debug-> Compile также будет включать синтаксические ошибки в поиск, что очень полезно.
Если ошибок не осталось и вы запускаете Debug-> Compile, может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции в текущий момент.
Debug->Compile Error Summary
Debug-> Compile находит ошибки компиляции (проекта).
Он также найдет синтаксические ошибки.
Он находит одну ошибку каждый раз, когда вы ее используете.
Если нет ошибок компиляции, оставленная опция Компиляция будет отображаться серым цветом в меню.
Debug-> Compile Usage
Вы должны всегда использовать Debug-> Compile, прежде чем запускать свой код. Это гарантирует, что ваш код не будет иметь ошибок компиляции при запуске.
Если вы не запускаете Debug-> Compile, то VBA может обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками времени выполнения.
Ошибки во время выполнения
Ошибки во время выполнения возникают, когда ваше приложение работает. Обычно они находятся вне вашего контроля, но могут быть вызваны ошибками в вашем коде.

Например, представьте, что ваше приложение читает из внешней рабочей книги. Если этот файл будет удален, то VBA отобразит ошибку, когда ваш код попытается открыть его.
Другие примеры ошибок времени выполнения
- база данных недоступна
- пользователь вводит неверные данные
- ячейка, содержащая текст вместо числа
Как мы уже видели, целью обработки ошибок является обработка ошибок времени выполнения, когда они возникают.
Ожидаемые и неожиданные ошибки
Когда мы думаем, что может произойти ошибка во время выполнения, мы помещаем код на место для ее обработки. Например, мы обычно помещаем код на место, чтобы иметь дело с файлом, который не найден.
Следующий код проверяет, существует ли файл, прежде чем он пытается его открыть. Если файл не существует, отображается сообщение, удобное для пользователя, и код выходит из подпрограммы.
Когда мы думаем, что в какой-то момент может произойти ошибка, рекомендуется добавить код для обработки ситуации. Мы обычно называем эти ошибки ожидаемыми.
Если у нас нет специального кода для обработки ошибки, это считается неожиданной ошибкой. Мы используем операторы обработки ошибок VBA для обработки непредвиденных ошибок.
Ошибки времени выполнения, которые не являются ошибками VBA
Прежде чем мы рассмотрим VBA Handling, мы должны упомянуть один тип ошибок. Некоторые ошибки во время выполнения не рассматриваются как ошибки VBA, а только пользователем.
Позвольте мне объяснить это на примере. Представьте, что у вас есть приложение, которое требует, чтобы вы добавили значения в переменные a и b
Допустим, вы по ошибке используете звездочку вместо знака плюс
Это не ошибка VBA. Ваш синтаксис кода является совершенно законным. Однако, с вашей точки зрения, это ошибка.
Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время выполнения
- Ожидаемые ошибки — напишите конкретный код для их обработки.
- Неожиданные ошибки — используйте операторы обработки ошибок VBA для их обработки.
Оператор VBA On Error используется для обработки ошибок. Этот оператор выполняет некоторые действия при возникновении ошибки во время выполнения.
Есть четыре различных способа использовать это утверждение
- On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
- On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
- On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
- On Error Goto -1 — очищает текущую ошибку.
Давайте посмотрим на каждое из этих утверждений по очереди.
On Error Goto 0
Это поведение по умолчанию VBA. Другими словами, если вы не используете On Error, это поведение вы увидите.
При возникновении ошибки VBA останавливается на строке с ошибкой и отображает сообщение об ошибке. Приложение требует вмешательства пользователя с кодом, прежде чем оно сможет продолжить. Это может быть исправление ошибки или перезапуск приложения. В этом случае обработка ошибок не происходит.
Давайте посмотрим на пример. В следующем коде мы не использовали строку On Error, поэтому VBA будет использовать поведение On Error Goto 0 по умолчанию.
Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.

Когда появляется ошибка, вы можете выбрать End или Debug
Если вы выберете Конец, то приложение просто остановится.
Если вы выберете Отладить, приложение остановится на строке ошибки, как показано на скриншоте ниже.

Это нормально, когда вы пишете код VBA, поскольку он показывает вам точную строку с ошибкой.
Это поведение не подходит для приложения, которое вы передаете пользователю. Эти ошибки выглядят непрофессионально и делают приложение нестабильным.
Подобная ошибка, по сути, приводит к сбою приложения. Пользователь не может продолжить работу без перезапуска приложения. Они могут вообще не использовать его, пока вы не исправите для них ошибку.
Используя On Error Goto [label], мы можем дать пользователю более контролируемое сообщение об ошибке. Это также предотвращает остановку приложения. Мы можем заставить приложение работать предопределенным образом.
On Error Resume Next
Использование On Error Resume Next указывает VBA игнорировать ошибку и продолжать работу.
Есть конкретные случаи, когда это полезно. Большую часть времени вы должны избегать его использования.
Если мы добавим Resume Next к нашему примеру Sub, то VBA проигнорирует ошибку деления на ноль
Это не очень хорошая идея, чтобы сделать это. Если вы игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может повлиять на приложение несколькими способами. Вы можете получить неверные данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что вы подавили ошибку.
Приведенный ниже код является примером использования Resume Next.
В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все, что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.
В приведенном выше коде мы продолжаем, если есть ошибка. Затем в следующей строке мы проверяем значение переменной Outlook. Если произошла ошибка, тогда значение этой переменной будет установлено равным Nothing.
Это пример того, когда Резюме может быть полезным. Дело в том, что, хотя мы используем Resume, мы все равно проверяем наличие ошибки. Подавляющее большинство времени вам не нужно будет использовать Resume.
On Error Goto [label]
Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на таких языках, как C # и Java.
При возникновении ошибки вы отправляете ошибку на определенный ярлык. Обычно это внизу саба.
Давайте применим это к подводной лодке, которую мы использовали
Снимок экрана ниже показывает, что происходит при возникновении ошибки.

VBA переходит на метку eh, потому что мы указали это в строке «Перейти к ошибке».
Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.
Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.
On Error Goto -1
Это утверждение отличается от других трех. Он используется для очистки текущей ошибки, а не для настройки конкретного поведения.
При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.
Это поведение относится только к текущей подпрограмме. Как только мы выйдем из саба, ошибка будет очищена автоматически.
Посмотрите на код ниже. Первая ошибка приведет к переходу кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.
Если мы добавим дальнейшую обработку ошибок, она не будет работать, поскольку ловушка ошибок не была очищена.
В коде ниже мы добавили строку
после того как мы поймаем первую ошибку.
Это не имеет никакого эффекта, так как ошибка не была очищена. Другими словами, код остановится на строке с ошибкой и отобразит сообщение.
Для устранения ошибки мы используем On Error Goto -1. Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам нужно установить ее снова.
В приведенном ниже коде мы добавляем эту строку, и вторая ошибка теперь приведет к переходу кода на метку eh_other.
Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.
Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.
Использование On Error
Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:
- Остановитесь и отобразите ошибку.
- Игнорируйте ошибку и продолжайте.
- Перейти к определенной строке.
VBA всегда будет настроен на одно из этих действий. Когда вы используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.
В следующем подпункте VBA изменяет поведение ошибки каждый раз, когда мы используем оператор On Error
Err объект
При возникновении ошибки вы можете просмотреть детали ошибки, используя объект Err.
При возникновении ошибки времени выполнения VBA автоматически заполняет объект Err деталями.
Приведенный ниже код выведет «Error Number: 13 Type Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в длинное целое число.
Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»
Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.
Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.
Получение номера строки
Функция Erl используется для возврата номера строки, где произошла ошибка.
Это часто вызывает путаницу. В следующем коде Erl вернет ноль.
Это потому, что нет номеров строк. Большинство людей не понимают этого, но VBA позволяет вам иметь номера строк.
Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.
Добавление номеров строк в код вручную затруднительно. Однако есть инструменты, которые позволят вам легко добавлять и удалять номера строк в подпрограмме.
Когда вы закончите работу над проектом и передадите его пользователю, в этот момент может быть полезно добавить номера строк. Если вы используете стратегию обработки ошибок в последнем разделе этого поста, то VBA сообщит строку, где произошла ошибка.
Использование Err.Raise
Err.Raise позволяет нам создавать ошибки. Мы можем использовать его для создания пользовательских ошибок для нашего приложения, что очень полезно. Это эквивалент оператора Throw в Java \ C #.
Давайте посмотрим на простой пример. Представьте, что мы хотим убедиться, что в ячейке есть запись длиной 5 символов. Мы могли бы иметь конкретное сообщение для этого
Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером, например
Использование Err.Clear
Err.Clear используется для очистки текста и чисел из объекта Err.Object. Другими словами, он очищает описание и номер.
Редко вам понадобится его использовать, но давайте рассмотрим пример, где вы могли бы.
В приведенном ниже коде мы подсчитываем количество ошибок, которые могут возникнуть. Для простоты мы генерируем ошибку для каждого нечетного числа.
Мы проверяем номер ошибки каждый раз, когда проходим цикл. Если число не равно нулю, то произошла ошибка. Как только мы посчитаем ошибку, нам нужно установить номер ошибки на ноль, чтобы он был готов проверить следующую ошибку.
Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.
Логирование
Ведение журнала означает запись информации из вашего приложения, когда оно запущено. При возникновении ошибки вы можете записать детали в текстовый файл, чтобы у вас была запись об ошибке.
Код ниже показывает очень простую процедуру регистрации
Вы можете использовать это так:
Журнал не только для записи ошибок. Вы можете записывать другую информацию во время работы приложения. При возникновении ошибки вы можете проверить последовательность событий до того, как произошла ошибка.
Ниже приведен пример регистрации. То, как вы реализуете журналирование, зависит от характера приложения и его полезности.
Наличие большого количества информации при работе с ошибкой может быть очень полезным. Часто пользователь может не дать вам точную информацию об ошибке, которая произошла. Глядя на журнал, вы можете получить более точную информацию об информации.
Другие элементы, связанные с ошибками
В этом разделе рассматриваются некоторые другие инструменты обработки ошибок, которые есть в VBA. Эти элементы считаются устаревшими, но я включил их, поскольку они могут существовать в устаревшем коде.
Функция ошибки
Функция Error используется для печати описания ошибки с заданным номером ошибки. Он включен в VBA для обеспечения обратной совместимости и не нужен, поскольку вместо него можно использовать описание Err.Description.
Ниже приведены некоторые примеры
Заявление об ошибке
Заявление об ошибке позволяет имитировать ошибку. Он включен в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
В следующем коде мы моделируем ошибку «Разделить на ноль».
Это утверждение включено в VBA для обратной совместимости. Вместо этого вы должны использовать Err.Raise.
Простая стратегия обработки ошибок
Со всеми различными опциями вы можете быть озадачены тем, как использовать обработку ошибок в VBA. В этом разделе я покажу вам, как реализовать простую стратегию обработки ошибок, которую вы можете использовать во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит

Следующий код показывает простую реализацию этой стратегии
Это хороший способ реализации обработки ошибок, потому что
- Нам не нужно добавлять код обработки ошибок в каждую подпрограмму.
- Если возникает ошибка, то VBA корректно завершает работу приложения.
Полная стратегия обработки ошибок
Стратегия выше имеет один недостаток. Он не сообщает вам, где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы должны сделать это сами.
В этом разделе я собираюсь представить более полную стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и номера строки в случае возникновения ошибки.
* Стек — это список вспомогательных функций, которые использовались в данный момент при возникновении ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех подпрограммах.
- Когда происходит ошибка, обработчик ошибок добавляет подробности к ошибке и вызывает ее снова.
- Когда ошибка достигает самой верхней подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма показывает простое визуальное представление о том, что происходит, когда в Sub3 возникает ошибка

Единственная грязная часть этого — правильное форматирование строк. Я написал две подводные лодки, которые справляются с этим, поэтому он позаботится о вас.
Это две вспомогательные подводные лодки
Пример использования этой стратегии
Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.
Результат выглядит так

Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

Примечание: вы можете получить следующую ошибку при использовании этого кода: