Data error 4 error serverscript

20 votes and 42 comments so far on Reddit

Create an account to follow your favorite communities and start taking part in conversations.

r/YourBizarreAdventure

r/YourBizarreAdventure - Yba - DATA ERROR

I created acc 8 days ago. Now, when I tried to join YBA I saw this error. IDK wth is it… Its new acc. Dif games are working but Yba shows me this. I wasnt exploiting on this acc. But the way on my dif acc its working. PLS help me. I rly need fix it on this acc.

level 2

Tons of rejoins doesnt help

level 1

i have the same exact problem. except i’m using my main acc instead of an alt. all other games i can join perfectly fine, but when i try and join yba, private server or public, that same error message pops up. already tried rejoining too.

level 2

your alt account might not be old enough to play yba although idk if yba has an account age requirement. if it does I’m pretty sure it’s either 15 or 30 days.

level 1

Yba kicks you if your data isn’t loaded correctly

level 2

And what should I do for correctly loading of my data?

level 1

I’ve been getting this too. Shouldn’t have decided to get a private server beforehand…

level 1

Thought this was just a roblox error but it might not be. Try reinstalling roblox

level 1

Did u dupe with the bow method ?

level 2

No. Its new acc. I didnt play Yba at this acc any.

level 1

It’s just only yba and not other games for some reason

level 1

i think its region locked or a network error

level 2

Mb Uzu block new user cause of dupes

About Community

Subreddit Icon

Welcome to the unofficial subreddit of YBA!



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

Содержание

  • 1 Причина ошибки
  • 2 Отключение антивируса или добавление игры в список исключений брандмауэра
    • 2.1 Отключение защиты в реальном времени
    • 2.2 Удаление антивируса
    • 2.3 Добавление исполняемого файла в список исключений брандмауэра
  • 3 Предотвращение конфликта приложений
  • 4 Установка UWP-версии игры
  • 5 Переустановка Roblox

Причина ошибки

Существует ряд случаев, которые могут привести к ошибке инициализации 4 в Роблоксе:

  1. Подключение с сервером заблокировано антивирусом или брандмауэром. Чтобы обойти блокировку, добавьте исполняемый файл Roblox в список исключений брандмауэра или отключите защиту антивируса в реальном времени.
  2. Конфликт на уровне программного обеспечения. Может возникнуть после установки утилит оптимизации Windows, которые могут остановить «ненужные» службы для улучшения производительности. В этом случае нужно отказаться от использования таких утилит путем их удаления.
  3. Используется модифицированная версия исполняемого файла. Ошибку можно обойти путем установки UWP-версии Roblox.
  4. Поврежденные разделы реестра Roblox. Как известно, у многих сбой произошел после установки проблемного обновления Роблокс, которое повредило некоторые разделы реестра. Если эта проблема коснулась вас, единственное решение — переустановить игру и очистить папку кэша Roblox.

Отключение антивируса или добавление игры в список исключений брандмауэра

С ошибкой инициализации 4 в Роблоксе можете столкнуться при использовании стороннего антивируса. Как известно, к этому сбою может быть причастно приложение безопасности F-Secure. Этот антивирус рассматривает Roblox как потенциальную угрозу безопасности и блокирует соединение с игровым сервером. Если убедились, что к ошибке причастен антивирус, есть 3 способа решить эту проблему:

  • отключить защиту в режиме реального времени;
  • удалить антивирус;
  • добавить Roblox в список исключений брандмауэра.

Отключение защиты в реальном времени

Это всего лишь временное исправление, но с помощью его можно устранить проблему отключением защиты в реальном времени перед запуском игры, чтобы предотвратить блокировку исполняемого файла Roblox. Шаги по отключению отличаются от установленного антивируса, но в большинстве случаев можно это сделать непосредственно из значка в системном трее.

После отключения защиты проверьте, блокируется ли запуск Roblox ошибкой 4.

Удаление антивируса

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

Чтобы определить, причастен ли антивирус к ошибке инициализации 4, это удалить его на время поиска причины.

Откройте раздел Программы и компоненты командой appwiz.cpl, запущенной из окна Win + R.

В списке найдите антивирусную программу, которая, скорее всего, препятствует запуску игры. Кликните по ней правой кнопкой мыши и удалите.

После завершения перезагрузите ПК и проверьте, решена ли проблема.

Добавление исполняемого файла в список исключений брандмауэра

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

Откройте брандмауэр Windows командой control firewall.cpl, запущенной из окна Win + R.

В левом меню выберите пункт «Разрешение взаимодействия с приложением или компонентом в брандмауэре Защитника Windows».

Кликните на кнопку «Изменить параметры», чтобы получить доступ к редактированию.

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

Предотвращение конфликта приложений

Сбой, сопровождающийся ошибкой инициализации 4, может возникнуть в результате конфликт приложений, который препятствует запуску Роблокс. Чтобы проверить, запустите Windows в режиме чистой загрузки. Это гарантирует, что никакие сторонние службы и приложения не будут препятствовать запуску игры.

Перейдите в меню конфигурации системы командой msconfig из окна Win + R.

На вкладке Службы отметьте флажком поле «Не отображать службы Майкрософт». После этого все основные службы Windows исчезнут из списка, так что не рискуете отключить компонент Windows, который требуется для стабильной работы системы. Затем нажмите на кнопку «Отключить все», чтобы предотвратить запуск сторонней службы при загрузке компьютера.

Затем перейдите на вкладку Автозагрузка и кликните на ссылке «Открыть Диспетчер задач».

В этом списке отключите все приложения из автозагрузки.

Затем перезагрузите компьютер, чтобы запустить Windows в режиме чистой загрузки. Если удалось запустить Roblox без ошибок, значит, в фоновом режиме работает сторонняя служба или процесс, которое препятствует запуску игры. Чтобы их найти, включайте по несколько служб и программ, перезагружая после этого ПК, пока не найдете проблемную. При обнаружении оставьте их отключенными, либо переустановите, в крайнем случае удалите.

Установка UWP-версии игры

Если столкнулись с ошибкой 4 в Windows 10, можно полностью избежать ее путем установки UWP-версии Роблокс.

Откройте в браузере Microsoft Store и найдите Roblox с помощью поисковой строки. Затем нажмите на кнопку «Получить».

После завершения загрузки будете автоматически перенаправлены в окно Microsoft Store. После запуска UWP-версии войдите в свою учетную запись Roblox, перейдите на вкладку «Игра» и посмотрите, препятствует ли ошибка запуску.

Переустановка Roblox

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

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

Перейдите в раздел Программы и компоненты командой appwiz.cpl из окна Win + R.

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

После загрузки откройте Проводник и перейдите в папку Roblox:

C:Users имя пользователя AppDataLocal

В папке Roblox нажмите Ctrl + A, чтобы выделить все содержимое, затем щелкните правой кнопкой мыши на выбранном элементе и выберите «Удалить», чтобы полностью ее очистить.

Затем перейдите на официальный сайт Roblox, войдите в свою учетную запись и запустите установку игры.

Some Roblox players are seeing the ‘Initialization error 4‘ every time they attempt to launch the game. This problem is not exclusive to a certain Windows operating system since it’s confirmed to occur on both Windows 7 and Windows 10.

Roblox Initialization Error 4

After investigating this problem, it turns out that this problem can occur due to several different causes. We made a list of instances where the ‘Initialization Error 4’ can occur:

  • Overprotective AV suite – According to some affected users, this problem can occur due to an overprotective security suite (AV or firewall) that is blocking the connection with the Roblox game server. In this case, you should be able to fix the problem by disabling the real-time protection, by uninstalling the problematic security suite, or by establishing a whitelisting rule in regards to Roblox.
  • Software conflict – As it turns out, this problem can also surface if you’re using a performance enhancer utility that ends up clearing some dependencies used by the game. In this case, you need to uninstall the problematic utility before you’ll be able to fix the initialization error with Roblox.
  • Using a modified version of the executable – If you are using a modified or outdated executable for Roblox on Windows 10, you might expect to see this error at every startup. In this case, you should be able to resolve the problem by making the switch to the UWP version of Roblox.
  • Corrupted Roblox registry keys – As it turns out, at one point in time Roblox released an update that broke the game for a lot of Windows users by corrupting a couple of registry keys belonging to the game. If the same thing happened to you, the only fix is to reinstall Roblox and clear the Roblox cache folder.

Method 1: Disabling overprotective AV or whitelisting Roblox (if applicable)

As several different affected users have reported, you can expect to encounter the Initialization error 4 with Roblox if you’re actively using an overprotective AV suite or 3rd party firewall.

F-Secure is most commonly reported to be the security app responsible for causing this problem. This happens due to a security protocol that treats Roblox like a potential security threat and blocks the connection with the game server.

If you find yourself in this scenario, there are 3 ways to fix this problem:

  • You can either disable the real-time protection of your AV or firewall
  • You can uninstall the overprotective AV or firewall suite
  • You can whitelist Roblox in your AV / Firewall settings

A. Disabling the real-time protection of AV / Firewall

This is only a temporary fix, but some affected users have managed to get this issue fixed by disabling real-time protection before launching the game in order to prevent the overprotective security suite from blocking the Roblox executable.

Of course, the steps of doing so will be different depending on which 3rd party suite you’re using, but in most cases, you will be able to do this directly from the tray bar icon of your AV/firewall.

Disabling the real-time protection on Avast Antivirus

Disabling the real-time protection on Avast Antivirus

Once the real-time protection is disabled, launch Roblox, and see if the error code is resolved.

B. Uninstalling overprotective AV suite

Keep in mind that just disabling the real-time protection might not be enough if you’re using a system-level firewal – Even if you disable the real-time protection, chances are the same security rules will still remain in place.

If this scenario is applicable, the only thing that will allow you to determine whether your firewall is to fault for the Initialization Error 4 in Roblox is to uninstall it temporarily and restart to see if the problem is resolved:

  1. Open up a Run dialog box by pressing Windows key + R. Inside the text box, type ‘appwiz.cpl’ and hit Enter to open up the Programs and Features window.
    Type appwiz.cpl and Press Enter to Open Installed Programs List
  2. Once you’re inside the Programs and Features menu, scroll down through the list of installed programs and locate the security suite that you think might be interfering with Roblox.
  3. When you locate the problematic AV suite, right-click on it and choose Uninstall from the newly appeared context menu.
    Uninstalling your antivirus
  4. Once you’re inside the uninstallation screen, follow the on-screen prompts to complete the operation.
    Note: if you want to be extra sure that you remove every bit of remnant file left behind by the security suite that you just uninstalled, there are some steps you can take to deep clean your AV directories.
  5. Restart your computer and see if the problem is now fixed.

C. Whitelisting the main Roblox executable

In case you are attempting to run a modified version of Roblox and you are getting a security warning that your firewall is blocking the connection, it’s clear that the built-in Windows firewall is to blame for this behavior.

If this scenario is applicable, you should be able to fix this problem by whitelisting the main Roblox executable from Windows Firewall. Here’s a quick guide on how to do this:

  1. Press Windows key + R to open up a Run dialog box. Next, type ”control firewall.cpl’ inside the text box and press Enter to open up the classic interface of the Windows Firewall.
    Accessing the Windows Defender Firewall
  2. Inside the Windows Defender Firewall menu, use the left-hand menu to click on Allow an app or feature through Windows Defender Firewall.
    Allowing an app or feature through Windows Defender
  3. Once you’re inside the Allowed app menu, click on the Change Settings button. Then, click on Yes at the UAC (User Account Control) prompt to allow admin access to the app.
    Changing the Settings of the Allowed Items in Windows Firewall
  4. Once you are granted admin access, scroll down through the list of applications and see if Roblox is present inside the list of items. If Roblox is already here, check the Private and Public boxes associated with the launcher before saving the changes.
  5. After Roblox has been successfully whitelisted, launch Roblox again, and see if the problem is now fixed.

In case you still end up seeing the same Initialization Error 4, move down to the next potential fix below.

Method 2: Preventing every other app conflict

Even if you’ve cleared your 3rd party antivirus from any blame regarding this issue, that doesn’t mean this problem is not occurring due to a different type of conflict that is affecting the launch of Roblox.

According to affected users, the best way of taking care of this problem is to configure your computer to start in clean boot mode.

This will ensure that no 3rd party processes and services are allowed to run and interfere with the launch of Roblox.

Here’s a quick guide on achieving a clean boot state on your Windows computer:

Note: The steps below will work on Windows 7, Windows 8.1, and Windows 10.

  1. Open up a Run dialog box by pressing Windows key + R. Next, type ‘msconfig’ inside the text box and press Enter to open up the System Configuration menu.
    Accessing the ‘msconfig’ utility via Run box

    Note: When you see the UAC (User Account Control), click Yes to grant administrative privileges.

  2. Once you’re inside the System Configuration menu, go ahead and click on the Services tab fro the top of the menu, then ensure that the box associated with ‘Hide all Microsoft Services‘ is checked.
    Disabling all non-Microsoft startup items

    Note: After you do this, all essentially Windows services will be removed from the list so you don’t run the risk of disabling a Windows component that’s important to the stability of your system.

  3. Now that you’ve successfully excluded all essential services from the list, go ahead and click on Disable all button to prevent any 3rd party service from being started at the next machine startup.
  4. Next, click on the Startup tab from the horizontal menu at the top, then click on Open Task Manager from the newly appeared screen.
    Opening the Startup items window via Task Manager
  5. Once you’re inside the Startup tab of Task Manager, go ahead and select each startup item before clicking the Disable button at the bottom of the window. Do this until every 3rd party item is disabled.
    Disabling Apps from Startup

    Note: This operation will ensure that no startup item will be called the next time you restart your computer.

  6. Restart your computer in order to allow your PC to boot in clean boot mode. Once the next startup is complete, launch Roblox and see if the problem is now fixed.Note: If this operation was successful and you just managed to launch the game without issues, you’ve just confirmed you’re dealing with a software conflict. If you have the time, you can determine the culprit by systematically re-enabling every disabled 3rd party process and service.Note 2: Regardless of the outcome of this method, you should reverse engineer the steps above and re-enable the services you previously disabled to avoid a clean boot at every computer startup.

If you the problem is still not resolved as you’re still seeing the Initialization 4 error when attempting to launch Roblox, move down to the next potential fix below.

Method 3: Using the UWP version of Roblox

If you’re encountering this issue on Windows 10, you can probably avoid the Initialization 4 error altogether by using the UWP (Universal Windows Platform) version of Roblox instead.

This workaround was confirmed to be effective by several different users that were previously unable to launch the conventional version of Roblox.

If you’re on Windows 10 and you have access to the Microsoft Store, follow the instructions below to use the official Roblox app on a Windows 10 computer:

  1. Start by accessing the official page of Roblox UWP and click on the Gen button to begin the download on your computer.
    Downloading Roblox

    Note: You can also do this by opening the Windows Store locally and searching for ‘roblox’ using the search function in the top-right corner of the screen.

  2. Once the download is completed, you should be automatically be redirected to the Microsoft Store window.
    Launching Roblox
  3. Once you have successfully launched the UWP version of Roblox, go ahead and log in with your Roblox account.
    Log in with the desktop app
  4. Once you are successfully signed in with your Roblox account, make your way to the Game tab and see if you can successfully avoid the Initialization error code.

If the same problem is still occurring, move down to the next potential fix below.

Method 4: Reinstall Roblox and clear the Roblox folder

If none of the methods above have worked for you, it’s overly likely that you’re seeing this error due to a Roblox update that ended up corrupting a couple of registry keys belonging to the game. This issue is quite widespread among players that were using the desktop launcher.

Fortunately, you can fix this problem by reinstalling Roblox in order to force a refresh on the current registry keys. On top of this, you should also clear the Roblox folder to ensure that no corrupted data is affecting the launch and causing the Initialization error 4.

Folllow the instructions below to reinstall Roblox and clear the Roblox folder:

  1. Press Windows key + R to open up a Run dialog box. Next, type ‘appwiz.cpl’ and press Enter to open up a Run dialog box.
    Type appwiz.cpl and Press Enter to Open Installed Programs List
  2. Once you’re inside the Programs and Files menu, scroll down through the list of installed applications & games and locate your Roblox installation.
  3. When you locate the Roblox installation, right-click on it, then choose Uninstall from the newly appeared context menu.
    Uninstalling Roblox
  4. Next, follow the on-screen prompts to complete the uninstallation operation, then restart your computer.
  5. Once the next startup is complete, open File Explorer and navigate to the Roblox folder:
    C:Users*Your Windows Username*AppDataLocal
  6. Inside the Roblox folder, press Ctrl + A to select everything inside, then right-click on a selected item, and choose Delete to clear any leftover data from the previous Roblox installation.
  7. Visit the official Roblox website again, sign in with your account, then follow the instructions to download the game’s dependencies again.
  8. Launch Roblox once again and see if you’re now able to get past the Initialization error.

Photo of Kevin Arrows

Kevin Arrows

Kevin is a dynamic and self-motivated information technology professional, with a Thorough knowledge of all facets pertaining to network infrastructure design, implementation and administration. Superior record of delivering simultaneous large-scale mission critical projects on time and under budget.


Обычно причиной ошибок, связанных с исполняемым файлом EXE при запуске программного обеспечения Autodesk 3DS Max 8, является повреждение или отсутствие файлов ServerScript.exe. Большую часть проблем, связанных с данными файлами, можно решить посредством скачивания и установки последней версии файла EXE. Запуск сканирования реестра после замены файла, из-за которого возникает проблема, позволит очистить все недействительные файлы ServerScript.exe, расширения файлов или другие ссылки на файлы, которые могли быть повреждены в результате заражения вредоносным ПО.

Типы Исполнимые файлы, которые используют EXE, также известны в качестве формата Windows Executable File. Мы подготовили для вас несколько версий файлов ServerScript.exe, которые походят для %%os%% и нескольких выпусков Windows. Данные файлы можно посмотреть и скачать ниже. К сожалению, в настоящее время в нашей базе могут отсутствовать некоторые версии файлов ServerScript.exe, но их можно запросить, нажав на кнопку Request (Запрос). Кроме того, Autodesk также может предоставить вам некоторые редкие файлы, которые отсутствуют в нашем каталоге.

Поместите новый файл ServerScript.exe на место предыдущего (перезаписав предыдущий). Проблема больше не должна возникать, однако, чтобы убедиться в этом окончательно, следует выполнить проверку. Проверьте, результат замены файла, запустив Autodesk 3DS Max 8 и убедившись, что сообщение об ошибке больше не выводится.

ServerScript.exe Описание файла
Тип файла: EXE
Тип приложения: 3D Landscaping and Animation
App: Autodesk 3DS Max 8
Версия выпуска: 2005
Компания: Autodesk
 
Имя: ServerScript.exe  

Байт: 20480
SHA-1: 5440adefdc18b5191e7288d4e1ce0ae08fd29974
MD5: 23e0b5b3059421af22f7e2d4d842832e
CRC32: ab78cbde

Продукт Solvusoft

Загрузка
WinThruster 2023 — Сканировать ваш компьютер на наличие ошибок реестра в ServerScript.exe

Windows
11/10/8/7/Vista/XP

Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление

EXE
ServerScript.exe

Идентификатор статьи:   503642

ServerScript.exe

Filename Идентификатор файла (контрольная сумма MD5) KB Загрузить
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8 2005
Разработчик программного обеспечения Autodesk
Версия Windows 2000 SP4
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk 3DS Max 8
Разработчик программного обеспечения Autodesk
Версия Windows 2000 SP4
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP1
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10 2005
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP1
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10 2005
Разработчик программного обеспечения Autodesk
Версия Windows 2000 Pro SP4
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP2
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10
Разработчик программного обеспечения Autodesk
Версия Windows XP Home SP1
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10
Разработчик программного обеспечения Autodesk
Версия Windows XP Pro SP1
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32
+ ServerScript.exe 23e0b5b3059421af22f7e2d4d842832e 20.00 KB
Application Autodesk Inventor Series 10
Разработчик программного обеспечения Autodesk
Версия Windows 2000 Pro SP4
Тип 64-разрядная (x64)
KB 20480
MD5 23e0b5b3059421af22f7e2d4d842832e
Контрольная сумма SHA1 5440adefdc18b5191e7288d4e1ce0ae08fd29974
CRC32: ab78cbde
каталог C:WindowsSystem32

Классические проблемы ServerScript.exe

Эти проблемы Autodesk 3DS Max 8, связанные с ServerScript.exe, включают в себя:

  • «Ошибка программы ServerScript.exe. «
  • «ServerScript.exe не является приложением Win32.»
  • «ServerScript.exe столкнулся с проблемой и закроется. «
  • «Не удается найти ServerScript.exe»
  • «Отсутствует файл ServerScript.exe.»
  • «Проблема при запуске приложения: ServerScript.exe. «
  • «Файл ServerScript.exe не запущен.»
  • «ServerScript.exe остановлен. «
  • «Ошибка пути программного обеспечения: ServerScript.exe. «

Обычно ошибки ServerScript.exe с Autodesk 3DS Max 8 возникают во время запуска или завершения работы, в то время как программы, связанные с ServerScript.exe, выполняются, или редко во время последовательности обновления ОС. Важно отметить, когда возникают проблемы ServerScript.exe, так как это помогает устранять проблемы Autodesk 3DS Max 8 (и сообщать в Autodesk).

Источник ошибок ServerScript.exe

Большинство проблем ServerScript.exe связаны с отсутствующим или поврежденным ServerScript.exe, вирусной инфекцией или недействительными записями реестра Windows, связанными с Autodesk 3DS Max 8.

В частности, проблемы с ServerScript.exe, вызванные:

  • Недопустимая или поврежденная запись ServerScript.exe.
  • Файл ServerScript.exe поврежден от вирусной инфекции.
  • ServerScript.exe злонамеренно удален (или ошибочно) другим изгоем или действительной программой.
  • Другое программное обеспечение, конфликтующее с Autodesk 3DS Max 8, ServerScript.exe или общими ссылками.
  • Поврежденная установка или загрузка Autodesk 3DS Max 8 (ServerScript.exe).

В 07.03.2022 в 15:45, igggrrr сказал:

День добрый! Смотрю пакет ip tv на телевизоре LG 42LB671V-ZF через замену адреса DNS. Подрывается просмотр на части российских каналов. В биллинге прочитал, что есть такая проблема и есть пути ее решения. Решил, что это поможет более устойчивой работе и других каналов. Перешёл по ссылке, но там подробно расписано как это устранить на самсунгах (не пробовал этот вариант) и ещё альтернативный (попроще) через установку Media Station X и добавление виджета ottplayer. Все сделал, но куда внести данные из биллинга — не разобрался. Пытался добавить плейлист (ссылка из настроек биллинга), пытался внести свои данные отсюда плюс публичный ключ… Попробовал разные комбинации, но результата нет. Либо этот вариант ( как и предупреждали) для моей модели не годится, либо нужно убрать подстановочный dns, либо ещё что-то ..  Здесь, на сайте решения не нашел, но, уверен, что оно есть. Не поделитесь ли, пожалуйста, актуальной ссылкой? Спасибо

Добрый день! Задался такой же целью, установил Media Station X, задал начальный адрес ott-play.com, не пошло, адрес не принимается, убрал подмену ДНС, все пошло. Нельзя использовать два способа одновременно.

fiona

fiona

Proxmox Staff Member


  • #2

Hi,

I’m not sure how to use the ‘-v’ command. I’m using fairly new drives, I got them around July — August 2021.

that needs to be done in the CLI, with zpool status -v.

I’m not sure how I’m getting errors if it passed the SMART test.

SMART works on the disk level, ZFS is one level above that. Either it could be a disk issue SMART missed or an issue within ZFS.

fiona

fiona

Proxmox Staff Member


  • #4

You definitely should recreate Dinodata4TB/vm-104-disk-0, and I think the other errors should be gone after running a scrub.

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

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

Этот материал, посвящённый обработке ошибок в JavaScript, разбит на три части. Сначала мы сделаем общий обзор системы обработки ошибок в JavaScript и поговорим об объектах ошибок. После этого мы поищем ответ на вопрос о том, что делать с ошибками, возникающими в серверном коде (в частности, при использовании связки Node.js + Express.js). Далее — обсудим обработку ошибок в React.js. Фреймворки, которые будут здесь рассматриваться, выбраны по причине их огромной популярности. Однако рассматриваемые здесь принципы работы с ошибками универсальны, поэтому вы, даже если не пользуетесь Express и React, без труда сможете применить то, что узнали, к тем инструментам, с которыми работаете.

Код демонстрационного проекта, используемого в данном материале, можно найти в этом репозитории.

1. Ошибки в JavaScript и универсальные способы работы с ними

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

throw new Error('something went wrong')

В ходе выполнения этой команды будет создан экземпляр объекта Error и будет сгенерировано (или, как говорят, «выброшено») исключение с этим объектом. Инструкция throw может генерировать исключения, содержащие произвольные выражения. При этом выполнение скрипта остановится в том случае, если не были предприняты меры по обработке ошибки.

Начинающие JS-программисты обычно не используют инструкцию throw. Они, как правило, сталкиваются с исключениями, выдаваемыми либо средой выполнения языка, либо сторонними библиотеками. Когда это происходит — в консоль попадает нечто вроде ReferenceError: fs is not defined и выполнение программы останавливается.

▍Объект Error

У экземпляров объекта Error есть несколько свойств, которыми мы можем пользоваться. Первое интересующее нас свойство — message. Именно сюда попадает та строка, которую можно передать конструктору ошибки в качестве аргумента. Например, ниже показано создание экземпляра объекта Error и вывод в консоль переданной конструктором строки через обращение к его свойству message.

const myError = new Error('please improve your code')
console.log(myError.message) // please improve your code

Второе свойство объекта, очень важное, представляет собой трассировку стека ошибки. Это — свойство stack. Обратившись к нему можно просмотреть стек вызовов (историю ошибки), который показывает последовательность операций, приведшую к неправильной работе программы. В частности, это позволяет понять — в каком именно файле содержится сбойный код, и увидеть, какая последовательность вызовов функций привела к ошибке. Вот пример того, что можно увидеть, обратившись к свойству stack.

Error: please improve your code
 at Object.<anonymous> (/Users/gisderdube/Documents/_projects/hacking.nosync/error-handling/src/general.js:1:79)
 at Module._compile (internal/modules/cjs/loader.js:689:30)
 at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
 at Module.load (internal/modules/cjs/loader.js:599:32)
 at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
 at Function.Module._load (internal/modules/cjs/loader.js:530:3)
 at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
 at startup (internal/bootstrap/node.js:266:19)
 at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)

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

▍Генерирование и обработка ошибок

Создание экземпляра объекта Error, то есть, выполнение команды вида new Error(), ни к каким особым последствиям не приводит. Интересные вещи начинают происходить после применения оператора throw, который генерирует ошибку. Как уже было сказано, если такую ошибку не обработать, выполнение скрипта остановится. При этом нет никакой разницы — был ли оператор throw использован самим программистом, произошла ли ошибка в некоей библиотеке или в среде выполнения языка (в браузере или в Node.js). Поговорим о различных сценариях обработки ошибок.

▍Конструкция try…catch

Блок try...catch представляет собой самый простой способ обработки ошибок, о котором часто забывают. В наши дни, правда, он используется гораздо интенсивнее чем раньше, благодаря тому, что его можно применять для обработки ошибок в конструкциях async/await.

Этот блок можно использовать для обработки любых ошибок, происходящих в синхронном коде. Рассмотрим пример.

const a = 5

try {
    console.log(b) // переменная b не объявлена - возникает ошибка
} catch (err) {
    console.error(err) // в консоль попадает сообщение об ошибке и стек ошибки
}

console.log(a) // выполнение скрипта не останавливается, данная команда выполняется

Если бы в этом примере мы не заключили бы сбойную команду console.log(b) в блок try...catch, то выполнение скрипта было бы остановлено.

▍Блок finally

Иногда случается так, что некий код нужно выполнить независимо от того, произошла ошибка или нет. Для этого можно, в конструкции try...catch, использовать третий, необязательный, блок — finally. Часто его использование эквивалентно некоему коду, который идёт сразу после try...catch, но в некоторых ситуациях он может пригодиться. Вот пример его использования.

const a = 5

try {
    console.log(b) // переменная b не объявлена - возникает ошибка
} catch (err) {
    console.error(err) // в консоль попадает сообщение об ошибке и стек ошибки
} finally {
    console.log(a) // этот код будет выполнен в любом случае
}

▍Асинхронные механизмы — коллбэки

Программируя на JavaScript всегда стоит обращать внимание на участки кода, выполняющиеся асинхронно. Если у вас имеется асинхронная функция и в ней возникает ошибка, скрипт продолжит выполняться. Когда асинхронные механизмы в JS реализуются с использованием коллбэков (кстати, делать так не рекомендуется), соответствующий коллбэк (функция обратного вызова) обычно получает два параметра. Это нечто вроде параметра err, который может содержать ошибку, и result — с результатами выполнения асинхронной операции. Выглядит это примерно так:

myAsyncFunc(someInput, (err, result) => {
    if(err) return console.error(err) // порядок работы с объектом ошибки мы рассмотрим позже
    console.log(result)
})

Если в коллбэк попадает ошибка, она видна там в виде параметра err. В противном случае в этот параметр попадёт значение undefined или null. Если оказалось, что в err что-то есть, важно отреагировать на это, либо так как в нашем примере, воспользовавшись командой return, либо воспользовавшись конструкцией if...else и поместив в блок else команды для работы с результатом выполнения асинхронной операции. Речь идёт о том, чтобы, в том случае, если произошла ошибка, исключить возможность работы с результатом, параметром result, который в таком случае может иметь значение undefined. Работа с таким значением, если предполагается, например, что оно содержит объект, сама может вызвать ошибку. Скажем, это произойдёт при попытке использовать конструкцию result.data или подобную ей.

▍Асинхронные механизмы — промисы

Для выполнения асинхронных операций в JavaScript лучше использовать не коллбэки а промисы. Тут, в дополнение к улучшенной читабельности кода, имеются и более совершенные механизмы обработки ошибок. А именно, возиться с объектом ошибки, который может попасть в функцию обратного вызова, при использовании промисов не нужно. Здесь для этой цели предусмотрен специальный блок catch. Он перехватывает все ошибки, произошедшие в промисах, которые находятся до него, или все ошибки, которые произошли в коде после предыдущего блока catch. Обратите внимание на то, что если в промисе произошла ошибка, для обработки которой нет блока catch, это не остановит выполнение скрипта, но сообщение об ошибке будет не особенно удобочитаемым.

(node:7741) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: something went wrong
(node:7741) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. */

В результате можно порекомендовать всегда, при работе с промисами, использовать блок catch. Взглянем на пример.

Promise.resolve(1)
    .then(res => {
        console.log(res) // 1

        throw new Error('something went wrong')

        return Promise.resolve(2)
    })
    .then(res => {
        console.log(res) // этот блок выполнен не будет
    })
    .catch(err => {
        console.error(err) // о том, что делать с этой ошибкой, поговорим позже
        return Promise.resolve(3)
    })
    .then(res => {
        console.log(res) // 3
    })
    .catch(err => {
        // этот блок тут на тот случай, если в предыдущем блоке возникнет какая-нибудь ошибка
        console.error(err)
    })

▍Асинхронные механизмы и try…catch

После того, как в JavaScript появилась конструкция async/await, мы вернулись к классическому способу обработки ошибок — к try...catch...finally. Обрабатывать ошибки при таком подходе оказывается очень легко и удобно. Рассмотрим пример.

;(async function() {
    try {
        await someFuncThatThrowsAnError()
    } catch (err) {
        console.error(err) // об этом поговорим позже
    }

    console.log('Easy!') // будет выполнено
})()

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

2. Генерирование и обработка ошибок в серверном коде

Теперь, когда у нас есть инструменты для работы с ошибками, посмотрим на то, что мы можем с ними делать в реальных ситуациях. Генерирование и правильная обработка ошибок — это важнейший аспект серверного программирования. Существуют разные подходы к работе с ошибками. Здесь будет продемонстрирован подход с использованием собственного конструктора для экземпляров объекта Error и кодов ошибок, которые удобно передавать во фронтенд или любым механизмам, использующим серверные API. Как структурирован бэкенд конкретного проекта — особого значения не имеет, так как при любом подходе можно использовать одни и те же идеи, касающиеся работы с ошибками.

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

  1. Универсальная обработка ошибок — некий базовый механизм, подходящий для обработки любых ошибок, в ходе работы которого просто выдаётся сообщение наподобие Something went wrong, please try again or contact us, предлагающее пользователю попробовать выполнить операцию, давшую сбой, ещё раз или связаться с владельцем сервера. Эта система не отличается особой интеллектуальностью, но она, по крайней мере, способна сообщить пользователю о том, что что-то пошло не так. Подобное сообщение гораздо лучше, чем «бесконечная загрузка» или нечто подобное.
  2. Обработка конкретных ошибок — механизм, позволяющий сообщить пользователю подробные сведения о причинах неправильного поведения системы и дать ему конкретные советы по борьбе с неполадкой. Например, это может касаться отсутствия неких важных данных в запросе, который пользователь отправляет на сервер, или в том, что в базе данных уже существует некая запись, которую он пытается добавить ещё раз, и так далее.

▍Разработка собственного конструктора объектов ошибок

Здесь мы воспользуемся стандартным классом Error и расширим его. Пользоваться механизмами наследования в JavaScript — дело рискованное, но в данном случае эти механизмы оказываются весьма полезными. Зачем нам наследование? Дело в том, что нам, для того, чтобы код удобно было бы отлаживать, нужны сведения о трассировке стека ошибки. Расширяя стандартный класс Error, мы, без дополнительных усилий, получаем возможности по трассировке стека. Мы добавляем в наш собственный объект ошибки два свойства. Первое — это свойство code, доступ к которому можно будет получить с помощью конструкции вида err.code. Второе — свойство status. В него будет записываться код состояния HTTP, который планируется передавать клиентской части приложения.

Вот как выглядит класс CustomError, код которого оформлен в виде модуля.

class CustomError extends Error {
    constructor(code = 'GENERIC', status = 500, ...params) {
        super(...params)

        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, CustomError)
        }

        this.code = code
        this.status = status
    }
}

module.exports = CustomError

▍Маршрутизация

Теперь, когда наш объект ошибки готов к использованию, нужно настроить структуру маршрутов. Как было сказано выше, нам требуется реализовать унифицированный подход к обработке ошибок, позволяющий одинаково обрабатывать ошибки для всех маршрутов. По умолчанию фреймворк Express.js не вполне поддерживает такую схему работы. Дело в том, что все его маршруты инкапсулированы.

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

{
    error: 'SOME_ERROR_CODE',
    description: 'Something bad happened. Please try again or contact support.'
}

Если на данном этапе происходящие кажется вам непонятным — не беспокойтесь — просто продолжайте читать, пробуйте работать с тем, о чём идёт речь, и постепенно вы во всём разберётесь. На самом деле, если говорить о компьютерном обучении, здесь применяется подход «сверху-вниз», когда сначала обсуждаются общие идеи, а потом осуществляется переход к частностям.

Вот как выглядит код обработчика маршрутов.

const express = require('express')
const router = express.Router()
const CustomError = require('../CustomError')

router.use(async (req, res) => {
    try {
        const route = require(`.${req.path}`)[req.method]

        try {
            const result = route(req) // Передаём запрос функции route
            res.send(result) // Передаём клиенту то, что получено от функции route
        } catch (err) {
            /*
            Сюда мы попадаем в том случае, если в функции route произойдёт ошибка
            */
            if (err instanceof CustomError) {
                /* 
                Если ошибка уже обработана - трансформируем её в 
                возвращаемый объект
                */

                return res.status(err.status).send({
                    error: err.code,
                    description: err.message,
                })
            } else {
                console.error(err) // Для отладочных целей

                // Общая ошибка - вернём универсальный объект ошибки
                return res.status(500).send({
                    error: 'GENERIC',
                    description: 'Something went wrong. Please try again or contact support.',
                })
            }
        }
    } catch (err) {
        /* 
         Сюда мы попадём, если запрос окажется неудачным, то есть,
         либо не будет найдено файла, соответствующего пути, переданному
         в запросе, либо не будет экспортированной функции с заданным
         методом запроса
        */
        res.status(404).send({
            error: 'NOT_FOUND',
            description: 'The resource you tried to access does not exist.',
        })
    }
})

module.exports = router

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

Теперь взглянем на файл маршрутов.

const CustomError = require('../CustomError')

const GET = req => {
    // пример успешного выполнения запроса
    return { name: 'Rio de Janeiro' }
}

const POST = req => {
    // пример ошибки общего характера
    throw new Error('Some unexpected error, may also be thrown by a library or the runtime.')
}

const DELETE = req => {
    // пример ошибки, обрабатываемой особым образом
    throw new CustomError('CITY_NOT_FOUND', 404, 'The city you are trying to delete could not be found.')
}

const PATCH = req => {
    // пример перехвата ошибок и использования CustomError
    try {
        // тут случилось что-то нехорошее
        throw new Error('Some internal error')
    } catch (err) {
        console.error(err) // принимаем решение о том, что нам тут делать

        throw new CustomError(
            'CITY_NOT_EDITABLE',
            400,
            'The city you are trying to edit is not editable.'
        )
    }
}

module.exports = {
    GET,
    POST,
    DELETE,
    PATCH,
}

В этих примерах с самими запросами ничего не делается. Тут просто рассматриваются разные сценарии возникновения ошибок. Итак, например, запрос GET /city попадёт в функцию const GET = req =>..., запрос POST /city попадёт в функцию const POST = req =>... и так далее. Эта схема работает и при использовании параметров запросов. Например — для запроса вида GET /city?startsWith=R. В целом, здесь продемонстрировано, что при обработке ошибок, во фронтенд может попасть либо общая ошибка, содержащая лишь предложение попробовать снова или связаться с владельцем сервера, либо ошибка, сформированная с использованием конструктора CustomError, которая содержит подробные сведения о проблеме.
Данные общей ошибки придут в клиентскую часть приложения в таком виде:

{
    error: 'GENERIC',
    description: 'Something went wrong. Please try again or contact support.'
}

Конструктор CustomError используется так:

throw new CustomError('MY_CODE', 400, 'Error description')

Это даёт следующий JSON-код, передаваемый во фронтенд:

{
    error: 'MY_CODE',
    description: 'Error description'
}

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

Не забудьте о том, что здесь лежит репозиторий с рассматриваемым здесь кодом. Можете его загрузить, поэкспериментировать с ним, и, если надо, адаптировать под нужды вашего проекта.

3. Работа с ошибками на клиенте

Теперь пришла пора описать третью часть нашей системы обработки ошибок, касающуюся фронтенда. Тут нужно будет, во-первых, обрабатывать ошибки, возникающие в клиентской части приложения, а во-вторых, понадобится оповещать пользователя об ошибках, возникающих на сервере. Разберёмся сначала с показом сведений о серверных ошибках. Как уже было сказано, в этом примере будет использована библиотека React.

▍Сохранение сведений об ошибках в состоянии приложения

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

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

  1. Глобальные ошибки — в эту категорию попадают сообщения об ошибках общего характера, приходящие с сервера, или ошибки, которые, например, возникают в том случае, если пользователь не вошёл в систему и в других подобных ситуациях.
  2. Специфические ошибки, выдаваемые серверной частью приложения — сюда относятся ошибки, сведения о которых приходят с сервера. Например, подобная ошибка возникает, если пользователь попытался войти в систему и отправил на сервер имя и пароль, а сервер сообщил ему о том, что пароль неправильный. Подобные вещи в клиентской части приложения не проверяются, поэтому сообщения о таких ошибках должны приходить с сервера.
  3. Специфические ошибки, выдаваемые клиентской частью приложения. Пример такой ошибки — сообщение о некорректном адресе электронной почты, введённом в соответствующее поле.

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

Здесь будет использоваться встроенная в React система управления состоянием приложения, но, при необходимости, вы можете воспользоваться и специализированными решениями для управления состоянием — такими, как MobX или Redux.

▍Глобальные ошибки

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

Сообщение о глобальной ошибке

Теперь взглянем на код, который хранится в файле Application.js.

import React, { Component } from 'react'

import GlobalError from './GlobalError'

class Application extends Component {
    constructor(props) {
        super(props)

        this.state = {
            error: '',
        }

        this._resetError = this._resetError.bind(this)
        this._setError = this._setError.bind(this)
    }

    render() {
        return (
            <div className="container">
                <GlobalError error={this.state.error} resetError={this._resetError} />
                <h1>Handling Errors</h1>
            </div>
        )
    }

    _resetError() {
        this.setState({ error: '' })
    }

    _setError(newError) {
        this.setState({ error: newError })
    }
}

export default Application

Как видно, в состоянии, в Application.js, имеется место для хранения данных ошибки. Кроме того, тут предусмотрены методы для сброса этих данных и для их изменения.

Ошибка и метод для сброса ошибки передаётся компоненту GlobalError, который отвечает за вывод сообщения об ошибке на экран и за сброс ошибки после нажатия на значок x в поле, где выводится сообщение. Вот код компонента GlobalError (файл GlobalError.js).

import React, { Component } from 'react'

class GlobalError extends Component {
    render() {
        if (!this.props.error) return null

        return (
            <div
                style={{
                    position: 'fixed',
                    top: 0,
                    left: '50%',
                    transform: 'translateX(-50%)',
                    padding: 10,
                    backgroundColor: '#ffcccc',
                    boxShadow: '0 3px 25px -10px rgba(0,0,0,0.5)',
                    display: 'flex',
                    alignItems: 'center',
                }}
            >
                {this.props.error}
                 
                <i
                    className="material-icons"
                    style={{ cursor: 'pointer' }}
                    onClick={this.props.resetError}
                >
                    close
                </font></i>
            </div>
        )
    }
}

export default GlobalError

Обратите внимание на строку if (!this.props.error) return null. Она указывает на то, что при отсутствии ошибки компонент ничего не выводит. Это предотвращает постоянный показ красного прямоугольника на странице. Конечно, вы, при желании, можете поменять внешний вид и поведение этого компонента. Например, вместо того, чтобы сбрасывать ошибку по нажатию на x, можно задать тайм-аут в пару секунд, по истечении которого состояние ошибки сбрасывается автоматически.

Теперь, когда всё готово для работы с глобальными ошибками, для задания глобальной ошибки достаточно воспользоваться _setError из Application.js. Например, это можно сделать в том случае, если сервер, после обращения к нему, вернул сообщение об общей ошибке (error: 'GENERIC'). Рассмотрим пример (файл GenericErrorReq.js).

import React, { Component } from 'react'
import axios from 'axios'

class GenericErrorReq extends Component {
    constructor(props) {
        super(props)

        this._callBackend = this._callBackend.bind(this)
    }

    render() {
        return (
            <div>
                <button onClick={this._callBackend}>Click me to call the backend</button>
            </div>
        )
    }

    _callBackend() {
        axios
            .post('/api/city')
            .then(result => {
                // сделать что-нибудь с результатом в том случае, если запрос оказался успешным
            })
            .catch(err => {
                if (err.response.data.error === 'GENERIC') {
                    this.props.setError(err.response.data.description)
                }
            })
    }
}

export default GenericErrorReq

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

▍Обработка специфических ошибок, возникающих при выполнении запросов

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

Сообщение о специфической ошибке

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

import React, { Component } from 'react'
import axios from 'axios'

import InlineError from './InlineError'

class SpecificErrorRequest extends Component {
    constructor(props) {
        super(props)

        this.state = {
            error: '',
        }

        this._callBackend = this._callBackend.bind(this)
    }

    render() {
        return (
            <div>
                <button onClick={this._callBackend}>Delete your city</button>
                <InlineError error={this.state.error} />
            </div>
        )
    }

    _callBackend() {
        this.setState({
            error: '',
        })

        axios
            .delete('/api/city')
            .then(result => {
                // сделать что-нибудь с результатом в том случае, если запрос оказался успешным
            })
            .catch(err => {
                if (err.response.data.error === 'GENERIC') {
                    this.props.setError(err.response.data.description)
                } else {
                    this.setState({
                        error: err.response.data.description,
                    })
                }
            })
    }
}

export default SpecificErrorRequest

Тут стоит отметить, что для сброса специфических ошибок недостаточно, например, просто нажать на некую кнопку x. То, что пользователь прочёл сообщение об ошибке и закрыл его, не помогает такую ошибку исправить. Исправить её можно, правильно сформировав запрос к серверу, например — введя в ситуации, показанной на предыдущем рисунке, имя города, который есть в базе. В результате очищать сообщение об ошибке имеет смысл, например, после выполнения нового запроса. Сбросить ошибку можно и в том случае, если пользователь внёс изменения в то, что будет использоваться при формировании нового запроса, то есть — при изменении содержимого поля ввода.

▍Ошибки, возникающие в клиентской части приложения

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

В поле ничего нет, мы сообщаем об этом пользователю

Вот код файла SpecificErrorFrontend.js, реализующий вышеописанный функционал.

import React, { Component } from 'react'
import axios from 'axios'

import InlineError from './InlineError'

class SpecificErrorRequest extends Component {
    constructor(props) {
        super(props)

        this.state = {
            error: '',
            city: '',
        }

        this._callBackend = this._callBackend.bind(this)
        this._changeCity = this._changeCity.bind(this)
    }

    render() {
        return (
            <div>
                <input
                    type="text"
                    value={this.state.city}
                    style={{ marginRight: 15 }}
                    onChange={this._changeCity}
                />
                <button onClick={this._callBackend}>Delete your city</button>
                <InlineError error={this.state.error} />
            </div>
        )
    }

    _changeCity(e) {
        this.setState({
            error: '',
            city: e.target.value,
        })
    }

    _validate() {
        if (!this.state.city.length) throw new Error('Please provide a city name.')
    }

    _callBackend() {
        this.setState({
            error: '',
        })

        try {
            this._validate()
        } catch (err) {
            return this.setState({ error: err.message })
        }

        axios
            .delete('/api/city')
            .then(result => {
                // сделать что-нибудь с результатом в том случае, если запрос оказался успешным
            })
            .catch(err => {
                if (err.response.data.error === 'GENERIC') {
                    this.props.setError(err.response.data.description)
                } else {
                    this.setState({
                        error: err.response.data.description,
                    })
                }
            })
    }
}

export default SpecificErrorRequest

▍Интернационализация сообщений об ошибках с использованием кодов ошибок

Возможно, сейчас вы задаётесь вопросом о том, зачем нам нужны коды ошибок (наподобие GENERIC), если мы показываем пользователю только сообщения об ошибках, полученных с сервера. Дело в том, что, по мере роста и развития приложения, оно, вполне возможно, выйдет на мировой рынок, а это означает, что настанет время, когда создателям приложения нужно будет задуматься о поддержке им нескольких языков. Коды ошибок позволяют отличать их друг от друга и выводить сообщения о них на языке пользователя сайта.

Итоги

Надеемся, теперь у вас сформировалось понимание того, как можно работать с ошибками в веб-приложениях. Нечто вроде console.error(err) следует использовать только в отладочных целях, в продакшн подобные вещи, забытые программистом, проникать не должны. Упрощает решение задачи логирования использование какой-нибудь подходящей библиотеки наподобие loglevel.

Уважаемые читатели! Как вы обрабатываете ошибки в своих проектах?

Понравилась статья? Поделить с друзьями:
  • Data error 127
  • Data error 1 error code 267
  • Data error 1 error 267 roblox
  • Data conversion error converting enum
  • Data address mark error