Загрузить PDF
Загрузить PDF
Данная статья объясняет, как создать фейковое сообщение об ошибке (VBScript) в Windows, используя только Блокнот.
-
1
Запустите Блокнот (NotePad). Нажмите сочетание клавиш [WIN-R] (Windows key + R) и введите «notepad.exe».
-
2
Скопируйте и вставьте следующий код: x=msgbox(«Здесь ваше сообщение», 4+16, «Здесь ваше название»). Другой код для ответов «да» или «нет» таков: onclick=msgbox («Здесь ваше сообщение»,20,»Здесь ваше название»).
-
3
Поменяйте надписи «Здесь ваше сообщение» и «Здесь ваше название» на текст по своему усмотрению. Кроме того, измените «4+16» на другую комбинацию, как показано в разделе «Советы» (это изменит тип сообщения об ошибке и кнопки).
-
4
Щелкните по вкладке «Файл» (File) и кликните «Сохранить» (Save). Укажите название вашего сообщения об ошибке и добавьте в конце расширение «.vbs».
-
5
Откройте VBS файл, и появится фейковое сообщение об ошибке!
Реклама
Советы
-
-
- 0 – только кнопка «OK»
- Кнопки (Первое число):
-
Реклама
Об этой статье
Эту страницу просматривали 62 328 раз.
Была ли эта статья полезной?
Как сделать ошибки в сложной системе полезными для пользователя
Уровень сложности
Простой
Время на прочтение
6 мин
Количество просмотров 1.4K
О чём вы в первую очередь думаете, когда слышите «legacy-продукт»? Сложность, техдолг и, конечно, ошибки. Случаются как регулярные инциденты ввиду проблем в конкретных компонентах, так и «скрытые ружья» в местах системы, которым уделили не так много внимания при изначальном системном дизайне.
Худшее, что можно сделать с ошибками в такой сложной системе — пойти решать их в лоб. Решение вряд ли станет подходящим для бизнес-задачи и может усложнить поддержку продукта или добавить ещё техдолга, который замедлит будущее развитие.
Меня зовут Александр, я руковожу продуктами CDN и DNS в компании EdgeЦентр. В этой статье я расскажу несколько историй о том, как правильная работа с ошибками не только сделала жизнь наших пользователей лучше, но и позволила избежать усложнения продуктов.
Природа ошибок
Оба продукта — как CDN, так и DNS, работают понятно: это система доставки контента и доменных имён. В первом случае мы предоставляем нашим клиентам сеть точек кэширования контента, а во втором — авторитативные DNS-серверы, которые хранят их записи. Функционал глобально не менялся со времён Танненбаума и его «Компьютерных Сетей», поэтому в нём не было явных проблемных зон.
Однако, за последние десятки лет сильно развивается концепция DNSaaS и CDNaaS — чем больше можно упаковать в CDN и DNS как сервис, тем больше продукты интересны клиенту. При равном качестве покрытия сети, скорости и надёжности работы, клиент склонен выбирать тот сервис, который решит большинство задач.
Мы стараемся не отставать от тренда: например, наша CDN поддерживает популярные протоколы сжатия, имеет image processing и может гибко управляться политиками прямо с источника. А DNS предлагает гибкие настройки балансировки и Failover-механизм, который включает и выключает источники клиента из раздачи для доступности ресурсов.
Дополнительные опции и фичи приводят к необходимости тонкой настройки, продвинутым интерфейсам и спискам опций. Наши пользователи — системные администраторы и инженеры, которые при помощи API сервисов создают нужную клиенту конфигурацию и могут гибко ей управлять. Однако, такие эксперты есть далеко не во всех компаниях, так что настраивать CDN и DNS приходят менеджеры, бизнес-аналитики и владельцы бизнеса. Им нужна система, в которой легко ориентироваться и можно быстро решать задачи.
Для этой категории пользователей на сайте EdgeЦентр у каждого нашего клиента есть свой личный кабинет, в котором он может подключать или отключать CDN, DNS и другие сервисы компании, а также настраивать их работу. И тут мы приходим к ограничениям бизнес-логики, которые надо транслировать клиенту. Например, некоторые опции могут не работать вместе (например, сжатие одного и того же контента разными алгоритмами). Или данные в аналитике могут быть представлены не так, как ожидает пользователь, и надо досыпать деталей, чтобы стало понятнее, как с этими данными работать.
Мы поставили перед собой большую задачу по наведению простоты и порядка в сложной системе. На примере нашего опыта расскажу о том, как:
-
сделать ошибки-ориентиры, которые помогают пользователю самостоятельно решить задачу;
-
скорректировать пользовательский опыт, чтобы данные не интерпретировались как ошибочные;
-
упростить работу со сложными ошибками так, чтобы они решались наиболее быстро.
Ошибки-ориентиры
DNS и CDN — достаточно простые продукты, работать с которыми может не только системный администратор, но и бизнес-пользователь. В то же время, в настройках этих сервисов присутствуют различные комплексные опции — в том числе, взаимоисключающие. Опции могут иметь разветвлённые дополнительные настройки. Таким образом, мы не всегда можем дать радиокнопки для выбора одной опции из многих, но и сохранить противоречивую комбинацию тоже не позволим. Мы не хотим допустить нестабильной работы системы, но в то же время — нужно выполнить бизнес-задачу нашего пользователя.
Допустим, клиент хочет сжать большой массив изображений и видео, чтобы загрузить их в карточки товара на маркетплейс и управлять контентом при помощи заголовков. Он выбирает такие опции, как «Сжатие GZip», «Сжатие Brotli», «Кастомный заголовок Host», сохраняет, и… ему прилетает сообщение страшного вида вроде «Error! [(‘brotli_compression’, ‘fetch_compressed’)] is not allowed».
Ошибка эта взялась из API, и системному администратору или инженеру будет вполне понятна, но бизнес-пользователя вводит в ступор.
Мы решили твёрдой рукой пройтись по всем возможным исключениям, чтобы навести порядок. Для этого мы залезли в конфигурацию, нашли все опции, которые невозможно использовать одновременно, и добавили к ним простой словарь. Этот словарь интерпретировал ошибку, выбранный язык в ЛК и отдавал пользователю сообщение вида:
Сжатие Brotli не может быть включено одновременно с оптимизацией доставки больших файлов, сжатием GZip или сжатием на источнике |
Brotli compression can’t be enabled along with large files delivery optimization, Fetch or GZip compression |
Стало уже лучше, но пользователь всё ещё мог запутаться в исключениях, поэтому мы оставили «человекочитаемые» подсказки, которые зависели от конкретной конфигурации сохранения.
В результате количество обращений за настройками в ЛК в техническую поддержку заметно снизилось. Наш абстрактный бизнес-пользователь даже без чтения документации научился настраивать сервис со второй попытки, учитывая ошибки сохранения.
Учим пользователей безошибочному чтению аналитики
Одна из важных фич CDN EdgeCenter — расширенная статистика. Она позволяет посмотреть метрики сервиса без выгрузки огромных массивов данных в BI-систему. Это хорошо подходит малому и среднему бизнесу, а также крупным клиентам на старте пользования сервисом. Мы показываем трафик в разных разрезах: по географии, по директориям и так далее.
Представим себе онлайн кинотеатр. Аналитик знает, что контент кинотеатра разложен по директориям, например, в /cinema/ru лежат российские фильмы, а в /cinema/int — зарубежные. Аналитик решает собрать статистику за N часов по пользователям в разных директориях, и приходит к выводу, что 45% пользователей смотрели зарубежные фильмы, а 70% — российские. В итоге получается 115% — очень сомнительный тотал, почему же так?
Пользователь имеет полное право прийти в сервис и сказать, что фича предоставляет недостоверные данные, с которыми нельзя работать, а следовательно, не имеет бизнес-ценности.
На самом деле статистика верна, ведь она отображает уникального пользователя ресурса, а один пользователь может посмотреть несколько фильмов за период времени, следовательно — посетить несколько директорий.
Так мы облегчили пользователям работу со статистикой и метриками. Работа над статистикой показала нам, что «объяснение и пример» — это хорошая практика для хинтов в тех случаях, где люди приходят с конкретной бизнес-гипотезой и пытаются выявить её достоверность при помощи цифр. Нужные подсказки мы добавили в разные элементы интерфейса, чтобы сделать взаимодействие с ним максимально понятным.
А что пошло не так?
Кроме предоставления авторитативных серверов с каталогами имён и кэширующих серверов с контентом и логикой его обработки, мы также работаем с пользователями сервисов, а значит — с их настройками, логами и так далее. Это означает, что всё пользовательское управление осуществляется через наши API-интерфейсы — зону возможных проблем и ошибок.
Мы крайне редко встречаем в пользовательских историях что-то совсем страшное, вроде 5ХХ кодов при попытке сохранения данных. Скорее можем предупредить пользователя о том, что он посылает некорректные данные (400) или пытается выполнить действие вне прав доступа (403).
При работе с API напрямую история вполне понятная — коды ошибок сразу дают понятие о том, куда посмотреть и как навести порядок. А что же делать с фронтом, который также отправляет данные по нашему API?
На заре сервиса было принято прекрасное решение — давайте писать на весь экран магическую фразу «Oops, something went wrong» («Упс, что-то пошло не так»). Системный администратор открывал консоль браузера и понимал, о чём идёт речь — получил ошибку 403, пошёл в документацию, обнаружил, что у него не хватает прав на нужное действие. А вот менеджеру или аналитику такое уведомление об ошибке мало что говорит и объясняет в чём и состоит ошибка.
Чтобы решить задачу и упростить жизнь пользователям компании и нашей техподдержке, мы взяли за основу рекомендации по обработке ошибок из RFC. Мы настроили систему так, чтобы со стандартным номером ошибки шёл вспомогательный текст. Например, мы рекомендуем пользователю проверить отправляемые данные, обновить страницу, обратиться к документации и т.д.
На помощь опять же пришли словари. В этот раз в виде «ключ-значение». Мы храним данные о кодах ошибок в key-value виде. Так мы всегда сможем добавить ранее необрабатываемый код и пояснение, или быстро изменить один из текущих хинтов для лучшей информативности.
Это решение позволило не усложнять обработку ошибок на фронте. При поимке любого кода кроме 200, бэк обращается в key-value хранилище и формирует нужное сообщение. Так что для фронта «Oops, something went wrong», как по волшебству превратился в «Error code 400 — Please, make sure that you are trying to send correct data».
И что в итоге?
Меньше обращений в техподдержку, повышение качества обращений («У меня тут 403» уже лучше, чем «Что-то сломалось»), выше уровень удовлетворённости сервисом. Мы, продакты — люди простые, видим метрики и прокачиваем их значения. Дальше мы продолжим повышать уровень простоты и понятности продуктов, потому что бизнесу важно выполнять свои задачи дёшево, быстро и без потерь в качестве работы.
Надеемся, что статья была вам полезна. Больше о работе продуктов EdgeЦентр читайте в нашем профиле.
#База знаний
-
0
Разбираемся, что такое исключения, зачем они нужны и как с ними работать.
vlada_maestro / shutterstock
Хлебом не корми — дай кому-нибудь про Java рассказать.
Из этой статьи вы узнаете:
- что такое исключения (Exceptions);
- как они возникают и чем отличаются от ошибок (Errors);
- зачем нужна конструкция try-catch;
- как разобраться в полученном исключении
- и как вызвать исключение самому.
Код вашей программы исправно компилируется и запускается, только вот вместо желанного результата вы видите непонятный текст. Строчки его будто кричат на вас, аж побагровели.
За примером далеко ходить не надо: сделаем то, что нам запрещали ещё в школе, — поделим на ноль.
public static void main(String[] args) {
hereWillBeTrouble(42, 0);
}
public static void hereWillBeTrouble(int a, int b) {
int oops = a / b;
System.out.println(oops);
}
А получим вот что:
Это и есть исключение.
«Исключение» — сокращение от слов «исключительный случай». Это ситуация, в которой программа не может продолжить работу или её работа становится бессмысленной. Причём речь не только о нештатных ситуациях — исключения бывают и намеренными, такие разработчик вызывает сам.
Это интересно. Исключения в Java появились уже в первой версии языка. А вот в языках, где их нет, вместо них возвращают коды ошибок.
У всех классов исключений есть общий класс-предок Throwable, от него наследуются классы Error и Exception, базовые для всех прочих.
Error — это критические условия, в которых работа программы должна быть завершена. Например, когда при выполнении программы закончилась память, произошёл сбой в системе или виртуальной машине. Не будем задерживаться на этой ветке, поскольку документация Java говорит:
Error is the superclass of all the exceptions from which ordinary programs are not ordinarily expected to recover.
Что в переводе означает: ошибки (Error) — это такие исключительные ситуации, в которых восстанавливать работу программы не предполагается.
То есть это проблемы, которые нельзя (недопустимо) исправлять на ходу. Всё, что нам остаётся, — извиниться перед пользователем и впредь писать программы, где возникнет меньше подобных ситуаций. Например, не допускать такой глубокой рекурсии, как в коде ниже:
static void notGood() {
System.out.println("Только не снова!");
notGood();
}
При работе этого метода у нас возникнет ошибка: Exception in thread «main» java.lang.StackOverflowError — стек вызовов переполнился, так как мы не указали условие выхода из рекурсии.
А теперь об Exception. Эти исключительные ситуации возникают, если разработчик допустил невыполнимую операцию, не предусмотрел особые случаи в бизнес-логике программы (или сообщает о них с помощью исключений).
1. Невыполнимая операция
Мир не рухнул, как в случае с Error, просто Java не знает, что делать дальше. Как раз из этого разряда деление на ноль в начале статьи: и правда, какое значение тогда присвоить переменной oops?
Убедитесь сами, что исключение класса ArithmeticException наследуется как раз от Exception.
Стоит запомнить. В IntelliJ IDEA, чтобы увидеть положение класса в иерархии, выберите его и нажмите Ctrl + H (или на пункт Type Hierarchy в меню Navigate).
Другая частая ситуация — обращение к несуществующему элементу массива. Например, у нас в нём десять элементов, а мы пытаемся обратиться к одиннадцатому.
2. Особый случай в бизнес-логике программы
Классика. Программируем задачу о перевозке волка, козы и капусты через реку: в лодке может быть только два пассажира, но волка с козой и козу с капустой нельзя оставлять на берегу вместе. Это и есть особый случай в бизнес-логике, который нельзя нарушать.
Или пользователь вводит дату начала некоторого периода и дату его окончания. Вторая дата не может быть раньше первой.
Или, допустим, у нас есть метод, который читает файл. Сам метод написан верно. Пользователь передал в него корректный путь. Только вот у этого работника нет права читать этот файл (его роль и права обусловлены предметной областью). Что же тогда методу возвращать? Вернуть-то нечего, ведь метод не отработал. Самое очевидное решение — выдать исключение.
В дерево исключений мы ещё углубимся, а сейчас посмотрим, что и как с ними делают.
Простейший вариант — ничего; возникает исключение — программа просто прекращает работать.
Чтобы убедиться в этом, выполним код:
public static void main(String[] args) {
hereWillBeTrouble(42, 0);
}
public static void hereWillBeTrouble(int a, int b) {
System.out.println("Всё, что было до...");
int oops = a / b;
System.out.println(oops);
System.out.println("Всё, что будет после...");
}
Так и есть: до деления на ноль код выполнялся, а после — нет.
Это интересно: когда возникает исключение, программисты выдают что-то вроде «код [вы]бросил исключение» или «код кинул исключение». А глагол таков потому, что все исключения — наследники класса Throwable, что значит «бросаемый» / «который можно бросить».
Второе, что можно делать с исключениями, — это их обрабатывать.
Для этого нужно заключить кусок кода, который может вызвать исключение, в конструкцию try-catch.
Как это работает: если в блоке try возникает исключение, которое указано в блоке catch, то исполнение блока try прервётся и выполнится код из блока catch.
Например:
public static void main(String[] args) {
hereWillBeTrouble();
}
private static void hereWillBeTrouble(int a, int b) {
int oops;
try {
System.out.println("Всё, что было до...");
oops = a / b;
System.out.println(oops);
System.out.println("Всё, что будет после...");
} catch (ArithmeticException e) {
System.out.println("Говорили же не делить на ноль!");
oops = 0;
}
System.out.println("Метод отработал");
}
Разберём этот код.
Если блок try кинет исключение ArithmeticException, то управление перехватит блок catch, который выведет строку «Говорили же не делить на ноль!», а значение oops станет равным 0.
После этого программа продолжит работать как ни в чём не бывало: выполнится код после блока try-catch, который сообщит: «Метод отработал».
Проверьте сами: запустите код выше. Вызовите метод hereWillBeTrouble с любыми значениями аргументов кроме нулевого b. Если в блоке try не возникнет исключений, то его код выполнится целиком, а в блок catch мы даже не попадём.
Есть ещё и третий вариант — пробросить исключение наверх. Но об этом в следующей статье.
Вернёмся к первой картинке. Посмотрим, что нам сказала Java, когда произошло исключение:
Начинаем разбирать сверху вниз:
— это указание на поток, в котором произошло исключение. В нашей простой однопоточной программе это поток main.
— какое исключение брошено. У нас это ArithmeticException. А java.lang.ArithmeticException — полное название класса вместе с пакетом, в котором он размещается.
— весточка, которую принесло исключение. Дело в том, что одно и то же исключение нередко возникает по разным причинам. И тут мы видим стандартное пояснение «/ by zero» — из-за деления на ноль.
— это самое интересное: стектрейс.
Стектрейс (Stack trace) — это упорядоченный список методов, сквозь которые исключение пронырнуло.
У нас оно возникло в методе hereWillBeTrouble на 8-й строке в классе Main (номер строки и класс указаны в скобках синим). А этот метод, в свою очередь, вызван методом main на 3-й строке класса Main.
Стектрейсы могут быть довольно длинными — из десятков методов, которые вызывают друг друга по цепочке. И они здорово помогают расследовать неожиданно кинутое исключение.
Советую закреплять теорию на практике. Поэтому вернитесь в блок про Error и вызовите метод notGood — увидите любопытный стектрейс.
Всё это время мы имели дело с исключением, которое бросает Java-машина — при делении на ноль. Но как вызвать исключение самим?
Раз исключение — это объект класса, то программисту всего-то и нужно, что создать объект с нужным классом исключения и бросить его с помощью оператора throw.
public static void main(String[] args) {
hereWillBeTrouble(42, 0);
}
private static void hereWillBeTrouble(int a, int b) {
if (b == 0) {
throw new ArithmeticException("ты опять делишь на ноль?");
}
int oops = a / b;
System.out.println(oops);
}
При создании большинства исключений первым параметром в конструктор можно передать сообщение — мы как раз сделали так выше.
А получим мы то же самое, что и в самом первом примере, только вместо стандартной фразы «/by zero» теперь выдаётся наш вопрос-пояснение «ты опять делишь на ноль?»:
В следующей статье мы углубимся в иерархию исключений Java, узнаем про их разделение на checked и unchecked, а также о том, что ещё интересного можно с ними делать.
Как зарабатывать больше с помощью нейросетей?
Бесплатный вебинар: 15 экспертов, 7 топ-нейросетей. Научитесь использовать ИИ в своей работе и увеличьте доход.
Узнать больше
Download Article
Download Article
Do you want to create a custom Windows error message? Whether you’re an application developer or someone who wants to prank their coworker, knowing how to create a custom error message is an essential ability. To learn how to create a custom Windows error message, follow this guide.
-
1
Open the Notepad app.
- Press the ⊞ Win+R keys simultaneously.
- Type notepad into the Run dialog.
- Hit ↵ Enter or click OK.
-
2
Copy and paste the following code into Notepad:
- x=msgbox(«Your Message Here», Button+Icon, «Your Title Here»)
Advertisement
-
3
Customize the button(s) of your error message. Replace Button in the code you pasted into Notepad with one of the following:
- 0 — OK
- 1 — OK and Cancel
- 2 — Abort, Retry and Ignore
- 3 — Yes, No and Cancel
- 4 — Yes and No
- 5 — Retry and Cancel
-
4
Customize the icon of your error message. Replace Icon in the code that you pasted into Notepad with one of the following:
- 0 = No Icon
- 16 = Critical Icon (a.k.a. «X» icon)
- 32 = Question Icon (a.k.a. «?» icon)
- 48 = Warning Icon (a.k.a. «!» icon)
- 64 = Info Icon (a.k.a. «i» icon)
-
5
Customize the title of your error message. Replace Your Title Here in the code you pasted into Notepad with what you want the title of the error message to be.
-
6
Customize the contents of your error message. Replace Your Message Here in the code you pasted into Notepad with what you want the error message to say.
-
7
Open the Save As window. Press Ctrl+S on your keyboard.
-
8
Expand the combo box next to Save as type and select All Files.
-
9
Type a name for your file followed by a period and vbs.
-
10
Choose a location to save the file to.
-
11
Save the file. Click Save.
-
12
Display the error message. Double-click the file that was created.
Advertisement
Create a sequence of error messages. Messages will display one at a time, and closing a message will display the following one.
-
1
Open the Notepad app.
- Press the ⊞ Win+R keys simultaneously.
- Type notepad into the Run dialog.
- Hit ↵ Enter or click OK.
-
2
Copy and paste the following code into Notepad:
- x=msgbox(«Your Message Here», Button+Icon, «Your Title Here»)
-
3
Customize the button(s) of your error message. Replace Button in the code you pasted into Notepad with one of the following:
- 0 — OK
- 1 — OK and Cancel
- 2 — Abort, Retry and Ignore
- 3 — Yes, No and Cancel
- 4 — Yes and No
- 5 — Retry and Cancel
-
4
Customize the icon of your error message. Replace Icon in the code that you pasted into Notepad with one of the following:
- 0 — No Icon
- 16 — Critical Icon (a.k.a. «X» icon)
- 32 — Question Icon (a.k.a. «?» icon)
- 48 — Warning Icon (a.k.a. «!» icon)
- 64 — Info Icon (a.k.a. «i» icon)
-
5
Customize the title of your error message. Replace Your Title Here in the code you pasted into Notepad with what you want the title of the error message to be.
-
6
Customize the contents of your error message. Replace Your Message Here in the code you pasted into Notepad with what you want the error message to say.
-
7
Switch to a subsequent line position.
-
8
Create another error message (if desired). Repeat these steps, starting from Step 3.
- This error message will display after the previously created one has been closed.
-
9
Open the Save As window. Press Ctrl+S on your keyboard.
-
10
Expand the combo box next to Save as type and select All Files.
-
11
Type a name for your file followed by a period and vbs.
-
12
Choose a location to save the file to.
-
13
Save the file. Click Save.
-
14
Display the error message. Double-click the file that was created.
Advertisement
Add New Question
-
Question
Is there a way to make a custom icon for the error?
No, you can try using different numbers, but most likely a real error will pop up.
-
Question
How do I make it do actions to my computer?
You can’t do that. It’s a fake error, meaning it won’t do anything to your computer.
-
Question
How do I create an input text box in the message?
Do this: InputVariableName=InputBox(«Prompt»,»Title»,»Value which is optional»)
See more answers
Ask a Question
200 characters left
Include your email address to get a message when this question is answered.
Submit
Advertisement
Video
Thanks for submitting a tip for review!
About This Article
Thanks to all authors for creating a page that has been read 572,331 times.