I have done a fresh installation on my local development machine of MediaWiki 1.24.2.
I have installed Scribunto and checked it is installed correctly on the list of extensions.
I’m getting an error when I try and create an InfoBox. The error is:
Lua error: Internal error: The interpreter exited with status 2
These are the steps I have taken the following steps to try and fix this.
I have been to the Mediawiki Scribunto page
I have added these lines to my LocalSettings.php file:
$wgScribuntoEngineConf['luastandalone']['memoryLimit'] = 209715200; # bytes
$wgMaxShellMemory = 204800; # in KB
This has not fixed things. I’m a but confused as to how to switch on error logging. The help page just says:
Assigning a file path to $wgScribuntoEngineConf[‘luastandalone’][‘errorFile’] and examining that output can be valuable in diagnosing memory allocation errors.
How do I assign a file path? — Solved Thanks for the help with this.
I enclose a [link][2] to my php.ini file and my LocalSettings.php file (Zipped together)
UPDATE — I have now managed to add a log file and the error in the log file is:
/var/www/extensions/Scribunto/engines/LuaStandalone/binaries/lua5_1_5_linux_32_generic/lua: Syntax error: «(» unexpected
UPDATE TWO
These are the full steps I take to replicate the error:
Start by checking for any package updates available and installing them
sudo apt-get update
sudo apt-get upgrade
Now install Apache, PHP and MySQL
sudo apt-get install apache2 -y
sudo apt-get install php5 libapache2-mod-php5 -y
sudo apt-get install mysql-server php5-mysql -y
sudo apt-get install php-apc php5-intl imagemagick
sudo apt-get install phpmyadmin
We can check the internal IP address of our Raspberry Pi with the following command (Make a note of it)
hostname -I
We can now create a database for our new MediaWIki installation. Start by logging in as root using the password you created earlier
mysql -u root -p
Here we are adding database=mediawikidb user=mediawikiuser and password=mediawikipassword:
CREATE DATABASE mediawikidb;
CREATE USER mediawikiuser@localhost IDENTIFIED BY 'mediawikipassword';
GRANT index, create, select, insert, update, delete, alter, lock tables on mediawikidb.* TO mediawikiuser@localhost;
Now we can make some changes to php.ini so we can increase the maximum file size and memory limit
cd /etc/php5/apache2/
nano php.ini
Replace ‘upload_max_filesize = 2M’ with ‘upload_max_filesize = 64M’
Replace ‘post_max_size = 8M’ with ‘post_max_size = 64M’
Save the file
Now we are going to empty the /var/www folder and change its ownership to pi
cd /var/www
sudo chown pi: .
sudo rm *
Now we can download MediaWiki, uncompress it and copy it into /var/www
mkdir /var/www/mediawiki
wget http://releases.wikimedia.org/mediawiki/1.24/mediawiki-1.24.2.tar.gz
tar -xvzf mediawiki-*.tar.gz
sudo mv mediawiki-*/* /var/www/
Now we can restart the relevant services
sudo service apache2 restart
sudo service mysql restart
Now open a browser and go to localhost and start the installation
To Complete Installation copy LocalSettings.php to /var/www/mediawiki
Now install Scribunto
Download from http://www.mediawiki.org/wiki/Special:ExtensionDistributor/Scribunto
tar -xzf Scribunto-REL1_24-b060fbd.tar.gz -C /var/www/mediawiki/extensions
sudo nano /etc/mediawiki/LocalSettings.php
add these lines at the end of the file and save
require_once «$IP/extensions/Scribunto/Scribunto.php»;
$wgScribuntoDefaultEngine = ‘luastandalone’;
$wgScribuntoEngineConf[‘luastandalone’][‘memoryLimit’] = 209715200; # bytes
$wgMaxShellMemory = 204800; # in KB
$wgScribuntoEngineConf[‘luastandalone’][‘errorFile’] = ‘/var/tmp/luaerror.log’;
chmod -R 777 /var/www/mediawiki/extentions/Scribunto/engines/LuaStandalone/
Now visit ‘http://en.wikipedia.org/wiki/Special:Export’ and enter Template:Infobox in the big box. Tick all three boxes and click Export
Open the file in Notepad or similar and do a find and replace text/plain with CONTENT_FORMAT_TEXT
Login to MediaWiki and go to Special:Import
Once everything has imported correctly go to the homepage and enter this at the top of the page:
{{Infobox
|title = test Infobox
|header1 = Main Heading
|header2 = First set of data
|label2 = Label
|data2 = Data
|header3 = Remove this line (optional)
|label3 = More Label
|data3 = More data
}}
Many thanks
- Исключения — это сценарии ошибок, которые изменяют нормальный поток выполнения программы.
- Процесс обработки возможных исключений называется обработкой исключений.
- Если исключения не обрабатываются должным образом, программа может завершиться преждевременно. Это может привести к повреждению данных или нежелательным результатам.
- Обработка исключений Python достигается тремя блоками ключевых слов — try, except и finally.
- Блок try содержит код, который может вызывать исключения или ошибки.
- Блок except используется для перехвата исключений и их обработки.
- Код блока catch выполняется только при возникновении соответствующего исключения.
- Может быть несколько блоков catch. Мы также можем поймать несколько исключений в одном блоке catch.
- Код блока finally всегда выполняется независимо от того, правильно ли выполнялась программа или возникла исключительная ситуация.
- Мы также можем создать блок else с блоком try-except. Код внутри блока else выполняется, если не возникают исключения.
Давайте посмотрим на пример.
def divide(x, y): print(f'{x}/{y} is {x / y}') divide(10, 2) divide(10, 0) divide(10, 4)
Если мы запустим указанную выше программу, мы получим следующий результат.
10/2 is 5.0 Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 6, in <module> divide(10, 0) File "/Users/pankaj/Documents/PycharmProjects/PythonTutorialPro/hello-world/exception_handling.py", line 2, in divide print(f'{x}/{y} is {x / y}') ZeroDivisionError: division by zero
Второй вызов функции div() вызвал исключение ZeroDivisionError, и программа завершилась.
Мы так и не получили результат третьего вызова метода DivX(), потому что мы не выполняли обработку исключений в нашем коде.
Давайте перепишем метод div() с правильной обработкой исключений. Если кто-то попытается разделить на 0, мы перехватим исключение и выведем сообщение об ошибке. Таким образом, программа не завершится преждевременно, и вывод будет более понятным.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) divide(10, 2) divide(10, 0) divide(10, 4)
Вывод:
10/2 is 5.0 division by zero 10/4 is 2.5
Что такое класс BaseException?
Класс BaseException — это базовый класс всех исключений. Он имеет четыре подкласса.
- Исключение-это базовый класс для всех исключений, не связанных с выходом.
- GeneratorExit-запрос на выход генератора.
- KeyboardInterrupt-программа, прерванная пользователем.
- SystemExit-запрос на выход из интерпретатора.
Встроенные классы исключений
Вот некоторые из встроенных классов исключений в Python:
- ArithmeticError — это базовый класс для арифметических ошибок.
- AssertionError — возникает, когда утверждение не выполняется.
- AttributeError — когда атрибут не найден.
- BufferError
- EOFError — чтение после конца файла
- ImportError — когда импортированный модуль не найден.
- LookupError — базовое исключение для ошибок поиска.
- MemoryError — при нехватке памяти
- NameError — когда имя не найдено глобально.
- OSError — базовый класс для ошибок ввода-вывода
- ReferenceError
- Ошибка выполнения
- StopIteration, StopAsyncIteration
- SyntaxError — недопустимый синтаксис
- SystemError — внутренняя ошибка интерпретатора Python.
- TypeError — недопустимый тип аргумента
- ValueError — недопустимое значение аргумента
Встроенные классы предупреждений
Класс Warning — это базовый класс для всех предупреждений. Он имеет следующие подклассы.
- BytesWarning — предупреждения, связанные с байтами и буфером, в основном связанные с преобразованием и сравнением строк.
- DeprecationWarning — предупреждение об устаревших функциях
- FutureWarning — базовый класс для предупреждения о конструкциях, которые будут семантически изменяться в будущем.
- ImportWarning — предупреждение об ошибках при импорте модулей
- PendingDeprecationWarning — предупреждение о функциях, поддержка которых в будущем будет прекращена.
- ResourceWarning — предупреждения об использовании ресурсов
- RuntimeWarning — предупреждения о сомнительном поведении во время выполнения.
- SyntaxWarning — предупреждение о сомнительном синтаксисе
- UnicodeWarning — предупреждения, связанные с преобразованием Unicode
- UserWarning — предупреждения, генерируемые кодом пользователя
Обработка нескольких исключений в одном блоке Except
Блок try может иметь несколько блоков except. Мы можем поймать определенные исключения в каждом из блоков except.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) except TypeError as e: print(e) except ValueError as e: print(e)
Код в каждом блоке except одинаковый. В этом сценарии мы можем обрабатывать несколько исключений в одном блоке except. Мы можем передать кортеж объектов исключения в блок except, чтобы поймать несколько исключений.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except (ZeroDivisionError, TypeError, ValueError) as e: print(e)
Поймать все исключения в блоке с одним исключением
Если мы не укажем какой-либо класс исключения в блоке except, он перехватит все исключения, вызванные блоком try. Это полезно, когда мы не знаем об исключениях, которые может вызвать блок try.
Пустое предложение except должно быть последним.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) except: print("unknown error occurred")
Использование else Block с try-except
Код блока else не является обязательным. Он выполняется, когда нет исключений, вызванных блоком try.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) else: print("divide() function worked fine.") divide(10, 2) divide(10, 0) divide(10, 4)
Вывод:
Код блока else выполняется дважды, когда блок try функции div() работал без каких-либо исключений.
Использование finally Block с try-except
Код блока finally выполняется во всех случаях, независимо от того, есть ли исключение или нет. Блок finally используется для закрытия ресурсов и выполнения действий по очистке.
def divide(x, y): try: print(f'{x}/{y} is {x / y}') except ZeroDivisionError as e: print(e) else: print("divide() function worked fine.") finally: print("close all the resources here") divide(10, 2) divide(10, 0) divide(10, 4)
Вывод:
Синтаксис
окончательный синтаксис таков:
try -> except 1...n -> else -> finally
У нас может быть много блоков except для блока try. Но у нас может быть только еще один else, finally блок.
Создание настраиваемого класса исключения
Мы можем создать собственный класс исключения, расширив класс Exception. Лучше всего создать базовое исключение, а затем наследовать другие классы. Вот несколько примеров.
class EmployeeModuleError(Exception): """Base Exception Class for our Employee module""" pass class EmployeeNotFoundError(EmployeeModuleError): """Error raised when employee is not found in the database""" def __init__(self, emp_id, msg): self.employee_id = emp_id self.error_message = msg class EmployeeUpdateError(EmployeeModuleError): """Error raised when employee update fails""" def __init__(self, emp_id, sql_error_code, sql_error_msg): self.employee_id = emp_id self.error_message = sql_error_msg self.error_code = sql_error_code
По соглашению об именах к имени класса исключения добавляется суффикс «Ошибка».
Вызов исключений
Мы можем использовать ключевое слово raise, чтобы генерировать исключение из нашего кода. Некоторые из возможных сценариев:
- Ошибка проверки входных параметров функции;
- Поймать исключение и затем выбросить собственное.
class ValidationError(Exception): pass def divide(x, y): try: if type(x) is not int: raise TypeError("Unsupported type") if type(y) is not int: raise TypeError("Unsupported type") except TypeError as e: print(e) raise ValidationError("Invalid type of arguments") if y is 0: raise ValidationError("We can't divide by 0.") try: divide(10, 0) except ValidationError as ve: print(ve) try: divide(10, "5") except ValidationError as ve: print(ve)
Вывод:
We can't divide by 0. Unsupported type Invalid type of arguments
Пример вложенных блоков try-except
У нас могут быть вложенные блоки try-except в Python. В этом случае, если во вложенном блоке try возникает исключение, для его обработки используется вложенный блок except. В случае, если вложенный объект except не может его обработать, для обработки исключения используются внешние блоки except.
x = 10 y = 0 try: print("outer try block") try: print("nested try block") print(x / y) except TypeError as te: print("nested except block") print(te) except ZeroDivisionError as ze: print("outer except block") print(ze)
Вывод:
outer try block nested try block outer except block division by zero
Советы
- Всегда пытайтесь обработать исключение в коде, чтобы избежать аварийного завершения программы.
- При создании настраиваемого класса исключения добавьте к его имени суффикс «Error».
- Если в предложениях except одинаковый код, попробуйте перехватить несколько исключений в одном блоке except.
- Используйте блок finally, чтобы закрыть тяжелые ресурсы.
- Используйте блок else для регистрации успешного выполнения кода, отправки уведомлений и т. д.
- По возможности избегайте голых исключений.
- Создавайте классы исключений для конкретных модулей для конкретных сценариев.
- Вы можете перехватить исключения в блоке except, а затем вызвать другое, которое будет более значимым.
- Всегда вызывайте с осмысленными сообщениями.
- Избегайте вложенных блоков try-except, потому что это снижает читаемость кода.
Languages:
- Bahasa Indonesia
- Deutsch
- Deutsch (Sie-Form)
- English
- Tagalog
- Türkçe
- dansk
- español
- français
- magyar
- polski
- português
- português do Brasil
- svenska
- čeština
- русский
- বাংলা
- 中文
- 日本語
Это расширение поставляется с MediaWiki 1.34 и выше. Таким образом, вам не нужно загружать его снова. Тем не менее, вы всё равно должны следовать другим инструкциям.
Это расширение работает поверх исполняемых. Вы должны иметь разрешение на запуск исполняемых файлов на хостовой машине, чтобы это расширение работало.
Статус релиза: стабильно |
|
---|---|
Реализация | Расширение парсера |
Описание | Предоставляет платформу, позволяющую встраивать сценарные языки программирования в страницы MediaWiki |
Автор(ы) |
|
Последняя версия | Постоянные обновления |
Политика совместимости | Snapshots releases along with MediaWiki. Master is not backward compatible. |
MediaWiki | >= 1.40.0 |
PHP | 5.5+ |
Лицензия | GPL-2.0-or-later AND MIT |
Скачать |
Скачать расширение
|
Пространство имён Module (ns:828), Talk_Module (ns:829) |
|
Параметры
|
|
Используемые хуки
|
|
Предоставляемые хуки
|
|
Quarterly downloads | 1,985 (Ranked 3rd) |
Public wikis using | 8,789 (Ranked 30th) |
Переведите расширение Scribunto, если оно доступно на translatewiki.net | |
Роль Vagrant | scribunto |
Проблемы | Открытые задачи · Сообщить об ошибке |
Расширение Scribunto (лат.: «пусть они напишут») позволяет встраивать в страницы MediaWiki модули, написанные на сценарных языках программирования.
На данный момент единственный поддерживаемый язык программирования — Lua.
Скрипты Scribunto размещаются в пространстве имён «Модуль».
Лицензия
Это расширение содержит код, распространяемый по лицензии GNU General Public License v2.0 или более поздней версии (GPL-2.0+), а также код, распространяемый по лицензии MIT License (MIT).
Требования
Совместимость с версиями PCRE
Рекомендуется версия PCRE 8.33+.
PCRE 8.33 была выпущена в мае 2013 года.
Вы можете просмотреть используемую PHP версию PCRE на веб-странице phpinfo(), или из командной строки, выполнив следующую команду:
php -r 'echo "pcre: " . ( extension_loaded( "pcre" ) ? PCRE_VERSION : "no" ) . "n";'
- Scribunto не будет работать, если установлена версия PCRE раньше 8.10.
- В PCRE 8.31 содержится ошибка с JIT-разбором паттернов, которая приводит к неработоспособности некоторых паттернов при использовании HHVM.
- В PCRE 8.32 есть ошибка, ввиду которой эта библиотека не может принимать некоторые несимвольные позиции Юникода, что приводит к ошибкам в модуле mw.html.
Операционные системы CentOS 6 и RHEL 6 ограничены версией PCRE 7 и должны быть обновлены для работы со Scribunto.
Обновление до версии 8.33 на сервере, использующем более старую версию, может быть проблематично.
Смотрите статью обновление на PCRE 8.33 или выше для подробностей о таком обновлении.
Расширение PHP pcntl (LTS)
Версии MediaWiki: |
1.25 – 1.28 |
Версии Scribunto для MediaWiki 1.25 — 1.28 требовали наличия расширения pcntl для PHP, которое доступно только на платформах под управлением ОС Unix/Linux. Это требование действовало только при использовании LuaStandalone (т. е. выполнении Lua в отдельном дочернем процессе).
Это расширение сделано необязательным в Scribunto для MediaWiki 1.29.
Вы можете просмотреть, включена ли поддержка pcntl, на веб-странице phpinfo(), или из командной строки, выполнив следующую команду:
php -r 'echo "pcntl: " . ( extension_loaded( "pcntl" ) ? "yes" : "no" ) . "n";'
PHP-расширение mbstring
В PHP должно быть включено расширение mbstring.
Вы можете проверить, включена ли поддержка mbstring, просмотрев веб-страницу phpinfo() или из командной строки с помощью следующей команды:
php -r 'echo "mbstring: " . ( extension_loaded( "mbstring" ) ? "yes" : "no" ) . "n";'
Lua binary
Bundled binaries
Scribunto comes bundled with Lua binary distributions for Linux (x86 and x86-64), Mac OS X Lion, and Windows (32- and 64-bit).
Scribunto should work for you out of the box if:
- Ваш веб-сервер работает на одной из вышеперечисленных платформ.
- Функция PHP
proc_open
не ограничена.[1] - Ваш веб-сервер настроен на выполнение двоичных файлов в дереве MediaWiki.
Заметка: Возможно, потребуется установить разрешения на выполнение; например, в Linux используйте:
-
chmod 755 /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
If you are using SELinux in «Enforcing» mode on your server, you might need to set a proper context for the binaries. Example for RHEL/CentOS 7:
chcon -t httpd_sys_script_exec_t /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
-
P.S. Check your version of the extension to see if the name of the engines folder is capitalised or fully lowercase.[2]
Additional binaries
Additional Lua binary distributions, which may be needed for your web server if its operating system is not in the list above, can be obtained from http://luabinaries.sourceforge.net/ or from your Linux distribution.
Only binary files for Lua 5.1.x are supported.
Once you’ve installed the appropriate binary file on your web server, configure the location of the file with:
# Where Lua is the name of the binary file # e.g. SourceForge LuaBinaries 5.1.5 - Release 2 name the binary file lua5.1 $wgScribuntoEngineConf['luastandalone']['luaPath'] = '/path/to/binaries/lua5.1';
Note that you should not add the above line unless you’ve confirmed that Scribunto’s built-in binaries don’t work for you.
LuaJIT, although theoretically compatible, is not supported.
The support was removed due to Spectre and bitrot concerns (phab:T184156).
Установка
- Скачайте и распакуйте файл(ы) в папку с названием
Scribunto
в вашей папкеextensions/
. - Добавьте следующий код внизу вашего
LocalSettings.php
:wfLoadExtension( 'Scribunto' ); $wgScribuntoDefaultEngine = 'luastandalone';
- Set execute permissions for the Lua binaries bundled with this extension:
chmod a+x /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/yourOS/lua
[2]
- Set type to
httpd_sys_script_exec_t
if SELinux is enforced:
chcon -t httpd_sys_script_exec_t /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/yourOS/lua
[2]
Готово – Перейдите на страницу Special:Version на своей вики, чтобы удостовериться в том, что расширение успешно установлено.
Для использующих MediaWiki 1.29 или более ранние версии:
В приведенных выше инструкциях описывается новый способ установки этого расширения с использованием wfLoadExtension()
.
Если вам нужно установить это расширение на более ранние версии (MediaWiki 1.29 и более ранние), вместо wfLoadExtension( 'Scribunto' );
, вам необходимо использовать:
require_once "$IP/extensions/Scribunto/Scribunto.php";
Установка Vagrant:
- Если вы используете Vagrant, установите с помощью
vagrant roles enable scribunto --provision
Optional installation
Интеграция расширений
Для более приятного пользовательского интерфейса с подсветкой синтаксиса и редактором кода с автоотступом установите следующие расширения:
- Расширение:WikiEditor
- Расширение:SyntaxHighlight
- Расширение:CodeEditor
Затем в свой LocalSettings.php
после регистрации всех расширений добавьте:
$wgScribuntoUseGeSHi = true; $wgScribuntoUseCodeEditor = true;
LuaSandbox
Мы разработали написанное на C расширение для PHP под названием LuaSandbox.
Это расширение может быть использовано как альтернатива отдельному исполняемому файлу и обеспечивает более высокую производительность.
См. LuaSandbox для подробностей об этом расширении и инструкции по его установке.
Если вы изначально устанавливали Scribunto для работы с отдельным двоичным файлом Lua, обязательно обновите LocalSettings.php
со следующей настройкой конфигурации:
$wgScribuntoDefaultEngine = 'luasandbox';
Настройка
Доступны следующие переменные конфигурации:
- $wgScribuntoDefaultEngine
- Выбирает тип движка. Допустимые значения — ключи массива
$wgScribuntoEngineConf
, по умолчанию это'luasandbox'
и'luastandalone'
. - $wgScribuntoUseGeSHi
- Если установлено Расширение:SyntaxHighlight, задайте эту переменную как true, чтобы это расширение использовалось при отображении модулей. (MediaWiki 1.30 или ранее.)
- $wgScribuntoUseCodeEditor
- Если установлено Расширение:CodeEditor, задайте эту переменную как
true
, чтобы это расширение использовалось при редактировании модулей. (MediaWiki 1.30 или ранее.) - $wgScribuntoEngineConf
- Ассоциативный массив для настройки движков. Ключи — допустимые значения переменной
$wgScribuntoDefaultEngine
, а значения — ассоциативные массивы с параметрами конфигурации. Каждый массив конфигурации должен содержать ключ'class'
, называющий используемый подкласс классаScribuntoEngineBase
.
LuaStandalone
В $wgScribuntoEngineConf
для Scribunto_LuaStandaloneEngine
используются нижеперечисленные ключи.
Обычно их задают примерно таким способом:
$wgScribuntoEngineConf['luastandalone']['key'] = 'value';
- luaPath
- Указывает путь к интерпретатору Lua.
- errorFile
- Указывает путь к файлу, к которому учётная запись веб-сервера имеет доступ на запись. В этот файл будут записываться ошибки и отладочный вывод самостоятельного интерпретатора.
- По умолчанию не ведётся запись ошибок, выводимых самостоятельным интерпретатором. Вы можете настроить эту запись как в следующей строке:
$wgScribuntoEngineConf['luastandalone']['errorFile'] = '/path/to/file.log';
- memoryLimit
- Указывает ограничение памяти в байтах, применяемое к процессу самостоятельного интерпретатора на Linux (осуществляется средствами ulimit).
- cpuLimit
- Указывает ограничение времени ЦП в секундах, применяемое к процессу самостоятельного интерпретатора на Linux (осуществляется средствами ulimit).
- allowEnvFuncs
- Задайте как true, чтобы разрешить использование в модулях функций setfenv и getfenv.
LuaSandbox
В $wgScribuntoEngineConf
для Scribunto_LuaSandboxEngine
используются нижеперечисленные ключи.
Обычно их задают примерно таким способом:
$wgScribuntoEngineConf['luasandbox']['Ключ'] = 'Значение';
- memoryLimit
- Указывает лимит памяти в байтайх.
- cpuLimit
- Указывает лимит процессорного времени в секундах.
- profilerPeriod
- Указывает время между опросами в секциях для профилировщика Lua.
- allowEnvFuncs
- Задайте как true, чтобы разрешить использование в модулях функций setfenv и getfenv.
Использование
Скрипты размещаются в новом пространстве имён Модуль.
Каждый модуль содержит набор функций, которые могут быть вызваны из вики-текста с помощью синтаксиса:
{{#invoke: Module_name | function_name | arg1 | arg2 | arg3 ... }}
Lua
Изучение Lua
Lua — простой язык программирования, который должен быть доступен для новичков.
Для быстрого введения в язык, попробуйте Learn Lua in 15 Minutes.
Лучшим комплексным введением в Lua служит книга Programming in Lua.
Её первое издание (для Lua 5.0) доступно в сети и в целом подходит для версии 5.1, используемой Scribunto:
- Programming in Lua (пролистайте ниже рекламы книг, чтобы найти текст)
Также полезен справочник:
- Расширение:Scribunto/Справочник Lua
Окружение Lua
Окружением в Lua называется набор глобальных переменных и функций.
Каждый вызов {{#invoke:}}
производится в отдельном окружении.
Переменные, определённые в одном {{#invoke:}}
, не будут доступны из прочих.
Это ограничение было необходимо для поддержки гибкости в реализации парсера вики-текста.
Окружение, в котором работают скрипты, не совсем то же, что в стандартном Lua. Их различия описаны на странице Extension:Scribunto/Справочник Lua.
Отладочная консоль
- См. также: Extension:Scribunto/Debug console
При редактировании модуля на Lua под окном редактирования располагается так называемая отладочная консоль.
В ней может исполняться код на Lua без необходимости сохранения и даже создания редактируемого модуля.
Поиск и устранение неисправностей
Обратите внимание, что красные сообщения Ошибка скрипта кликабельны и могут предоставить детальную информацию.
Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 1.
When using the LuaStandalone engine (this is the default), errors along the lines of «Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 1.» may be generated if the standalone Lua interpreter cannot be executed or runs into various runtime errors.
Чтобы получить больше информации, присвойте путь к файлу параметру $wgScribuntoEngineConf['luastandalone']['errorFile']
.
Ошибки интерпретатора будут логгироваться в указанный файл, что должно помогать в отслеживании проблемы.
Информация в журнале отладки включает в себя отладочную информацию, поэтому ее так много.
You should be able to ignore any line beginning with «TX» or «RX».
If you’re setting up Scribunto and are using IIS/Windows, this appears to be solved by commenting out a particular line.
Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 2.
When using the LuaStandalone engine (this is the default), status 2 suggests memory allocation errors, probably caused by settings that allocate inadequate memory space for PHP or Lua, or both.
Assigning a file path to $wgScribuntoEngineConf['luastandalone']['errorFile']
and examining that output can be valuable in diagnosing memory allocation errors.
Increase PHP allocation in your PHP configuration; add the line memory_limit = 200M
.
This allocation of 200MB is often sufficient (as of MediaWiki 1.24) but can be increased as required.
Set Scribunto’s memory allocation in LocalSettings.php
as a line:
$wgScribuntoEngineConf['luastandalone']['memoryLimit'] = 209715200; # в байтах
Finally, depending on the server configuration, some installations may be helped by adding another LocalSettings.php
line
$wgMaxShellMemory = 204800; # в КБ
Обратите внимание, что лимита памяти задаются в разных единицах.
Lua error: Internal error: 2. on ARM architecture
If you’re using an ARM architecture processor like on a RaspberryPi you’ll face the error Lua error: Internal error: The interpreter exited with status 2.
due to wrong delivered binary format of the Lua interpreter.
Check your Lua interpreter in:
/path/to/webdir/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_32_generic
Check the interpreter by using:
file lua
The result should look like :
lua: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0
The installed default Lua interpreter shows:
lua: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9,
look at the «Intel 80386» part what definitely is not correct.
Check in /usr/bin
what version of Lua is installed on your system. If you have lua5.1 installed, you can either copy the interpreter to your lua5_1_5_linux_32_generic
directory or set in your LocalSettings.php:
$wgScribuntoEngineConf['luastandalone']['luaPath'] = '/usr/bin/lua5.1'
At present don’t set wgScribuntoEngineConf
to /usr/bin/lua5.3, it’ll lead to the «Internal error 1».
Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 24.
When using the LuaStandalone engine (this is the default), status 24 suggests CPU time limit errors, although those should be generating a «The time allocated for running scripts has expired» message instead.
It would be useful to file a task in Фабрикатор and participate in determining why the XCPU signal isn’t being caught.
Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 126.
При использовании движка LuaStandalone (по умолчанию), могут генерироваться ошибки наподобие «Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 126.», если интерпретатор Lua не может быть запущен.
В большинстве случаев это происходит в двух случаях:
- У исполняемого файла lua не задано разрешение на исполнение (
x
). Установите разрешения как указано в разделе #Установка. - Сервер не позволяет запуск файлов из места установки файла, например, файловая система смонтирована с флагом
'noexec'
. Чаще всего это происходит с серверами с общим хостингом. Remedies include adjusting$wgScribuntoEngineConf['luastandalone']['luaPath']
to point to a Lua 5.1 binary installed in an executable location, or adjusting or convincing the shared host to adjust the setting preventing execution.
Ошибки вроде: Fatal exception of type MWException
Check the MediaWiki, PHP, or webserver logs for more details on the exception, or temporarily set $wgShowExceptionDetails to true
.
версия ‘GLIBC_2.11’ не найдена
If the above gives you errors such as «version ‘GLIBC_2.11’ not found», it means the version of the standard C library on your system is too old for the binaries provided with Scribunto.
You should upgrade your C library, or use a version of Lua 5.1 compiled for the C library you do have installed.
To upgrade your C library, your best option is usually to follow your distribution’s instructions for upgrading packages (or for upgrading to a new release of the distribution, if applicable).
If you copy the lua binaries from Scribunto master (or from gerrit:77905), that should suffice, if you can’t or don’t want to upgrade your C library.
The distributed binaries were recently recompiled against an older version of glibc, so the minimum is now 2.3 rather than 2.11.
Lua errors in Scribunto files
Errors here include:
- attempt to index field ‘text’ (a nil value)
- Lua error in mw.html.lua at line 253: Invalid class given:
If you are getting errors such these when attempting to use modules imported from WMF wikis, most likely your version of Scribunto is out of date.
Upgrade if possible; for advanced users, you might also try to identify the needed newer commits and cherry-pick them into your local installation.
preg_replace_callback(): Compilation failed: unknown property name after P or p at offset 7
preg_replace_callback(): Compilation failed: unknown property name after P or p at offset 7
- this usually indicates an incompatible version of PCRE; you’ll need to update to >= 8.10
- @todo: link to instructions on how to upgrade
Lua error
If you copy templates from Wikipedia and then get big red «Lua error: x» messages where the Scribunto invocation (e.g. the template that uses {{#invoke:}}
) should be, that probably means that you didn’t import everything you needed. Make sure that you tick the «Include templates» box at w:Special:Export when you export.
When importing pages from another wiki, it is also possible for templates or modules in the imported data to overwrite existing templates or modules with the same title, which may break existing pages, templates, and modules that depend on the overwritten versions.
Blank screen
Make sure your extension version is applicable to your MediaWiki version.
Design documents
Tim Starling’s presentation at linux.conf.au 2014 discussing the motivations, implementation challenges and results of deploying Scribunto and Lua. Extension:Scribunto/Parser interface design- Extension:Scribunto/Victor’s API proposal
- Extension:Scribunto/Documentation specification
- Extension:Scribunto/Tim’s draft roadmap
Другие страницы
- Extension:Scribunto/Deployment priorities
- Extension:Scribunto/Brainstorming
- Lua scripting — Wikimedia activity page describing deployment plan to Wikimedia sites.
- Расширение:Scribunto/Справочник Lua — The reference about the Lua language, as well as its standard libraries and common Scribunto modules supported on Wikimedia sites.
- Extension:Scribunto/Lua 5.2 changes — A list of known changes in Lua 5.2 that may cause code written in 5.1 to function unexpectedly.
- Расширение:Scribunto/Примеры модулей
- Extension:Scribunto/Example extension — Code for example extensions extending the Scribunto library.
- Extension:Scribunto/We use Lua
Смотрите также
- General
- Lua Wikibase client — functionality for the Scribunto extension.
- Commons:Lua — there may be specific notes for using Lua modules on Wikimedia Commons, including additional Lua extensions installed (e.g. for local support of internationalization and for parsing or playing medias). Some general purpose modules may be reused in other wikis in various languages (except specific tunings for policies, namespaces or project/maintenance pages with dedicated names). If possible, modules that could be widely reused across wikis should be tested and internationalized on Wikimedia Commons.
- w:Help:Lua — there may be specific notes for using Lua modules on Wikipedia, including additional Lua extensions installed (including for integrating Wikidata and Wikimedia Commons contents, generating complex infoboxes and navigation boxes, or to facilitate the general administration/maintenance of the wiki contents under applicable policies). Some other localized Wikipedia editions (or other projects such Wiktionnary, Wikisource or Wikinews) may also have their own needs and Lua modules.
- d:Help:Lua — there may be specific notes for using Lua modules on Wikidata, including additional Lua extensions installed (e.g. for local support of internationalization and for database queries)
- Extensions
- Расширение:Capiunto — Provides basic infobox functionality for the Scribunto extension.
- Semantic Scribunto — provides native support for the Scribunto extension for usage with Расширение:Semantic MediaWiki
- VariablesLua — provides a Scribunto Lua interface for the Variables extension
- Расширение:Wikibase Client — provides Wikibase (part of Wikidata project)
Примечания
- ↑ то есть Scribunto не будет работать, если
proc_open
указан в массивеdisable_functions
в файле «php.ini» вашего сервера. Если это так, вы можете увидеть сообщение об ошибке, напримерproc_open(): open_basedir restriction in effect. File(/dev/null) is not within the allowed path(s):
. Если вы используете Plesk и вам предоставлены достаточные разрешения, вы можете установитьopen_basedir
в настройках PHP для своего домена или поддомена. Попробуйте изменить{WEBSPACEROOT}{/}{:}{TMP}{/}
на{WEBSPACEROOT}{/}{:}{TMP}{/}{:}/dev/null{:}/bin/bash
. - ↑ 2.0 2.1 2.2 The name of the engines folder changed from lowercase to capitalised in 2022.
Это расширение используется в одном или нескольких проектах Викимедиа. Вероятно, это означает, что расширение стабильно и работает достаточно хорошо, чтобы использоваться такими сайтами с высоким трафиком. Найдите название этого расширения в файлах конфигурации Викимедиа CommonSettings.php и InitialiseSettings.php, чтобы узнать, где оно установлено. Полный список расширений, установленных на конкретной вики, можно увидеть на странице Special:Version wiki. |
Обработка ошибок увеличивает отказоустойчивость кода, защищая его от потенциальных сбоев, которые могут привести к преждевременному завершению работы.
Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в Python исключения, важно понять, что есть тонкая грань между понятиями ошибки и исключения.
Ошибку нельзя обработать, а исключения Python обрабатываются при выполнении программы. Ошибка может быть синтаксической, но существует и много видов исключений, которые возникают при выполнении и не останавливают программу сразу же. Ошибка может указывать на критические проблемы, которые приложение и не должно перехватывать, а исключения — состояния, которые стоит попробовать перехватить. Ошибки — вид непроверяемых и невозвратимых ошибок, таких как OutOfMemoryError
, которые не стоит пытаться обработать.
Обработка исключений делает код более отказоустойчивым и помогает предотвращать потенциальные проблемы, которые могут привести к преждевременной остановке выполнения. Представьте код, который готов к развертыванию, но все равно прекращает работу из-за исключения. Клиент такой не примет, поэтому стоит заранее обработать конкретные исключения, чтобы избежать неразберихи.
Ошибки могут быть разных видов:
- Синтаксические
- Недостаточно памяти
- Ошибки рекурсии
- Исключения
Разберем их по очереди.
Синтаксические ошибки (SyntaxError)
Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде.
Рассмотрим на примере.
a = 8
b = 10
c = a b
File "", line 3
c = a b
^
SyntaxError: invalid syntax
Стрелка вверху указывает на место, где интерпретатор получил ошибку при попытке исполнения. Знак перед стрелкой указывает на причину проблемы. Для устранения таких фундаментальных ошибок Python будет делать большую часть работы за программиста, выводя название файла и номер строки, где была обнаружена ошибка.
Недостаточно памяти (OutofMemoryError)
Ошибки памяти чаще всего связаны с оперативной памятью компьютера и относятся к структуре данных под названием “Куча” (heap
). Если есть крупные объекты (или) ссылки на подобные, то с большой долей вероятности возникнет ошибка OutofMemory
. Она может появиться по нескольким причинам:
- Использование 32-битной архитектуры Python (максимальный объем выделенной памяти невысокий, между 2 и 4 ГБ);
- Загрузка файла большого размера;
- Запуск модели машинного обучения/глубокого обучения и много другое;
Обработать ошибку памяти можно с помощью обработки исключений — резервного исключения. Оно используется, когда у интерпретатора заканчивается память и он должен немедленно остановить текущее исполнение. В редких случаях Python вызывает OutofMemoryError
, позволяя скрипту каким-то образом перехватить самого себя, остановить ошибку памяти и восстановиться.
Но поскольку Python использует архитектуру управления памятью из языка C (функция malloc()
), не факт, что все процессы восстановятся — в некоторых случаях MemoryError
приведет к остановке. Следовательно, обрабатывать такие ошибки не рекомендуется, и это не считается хорошей практикой.
Ошибка рекурсии (RecursionError)
Эта ошибка связана со стеком и происходит при вызове функций. Как и предполагает название, ошибка рекурсии возникает, когда внутри друг друга исполняется много методов (один из которых — с бесконечной рекурсией), но это ограничено размером стека.
Все локальные переменные и методы размещаются в стеке. Для каждого вызова метода создается стековый кадр (фрейм), внутрь которого помещаются данные переменной или результат вызова метода. Когда исполнение метода завершается, его элемент удаляется.
Чтобы воспроизвести эту ошибку, определим функцию recursion
, которая будет рекурсивной — вызывать сама себя в бесконечном цикле. В результате появится ошибка StackOverflow
или ошибка рекурсии, потому что стековый кадр будет заполняться данными метода из каждого вызова, но они не будут освобождаться.
def recursion():
return recursion()
recursion()
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
in
----> 1 recursion()
in recursion()
1 def recursion():
----> 2 return recursion()
... last 1 frames repeated, from the frame below ...
in recursion()
1 def recursion():
----> 2 return recursion()
RecursionError: maximum recursion depth exceeded
Ошибка отступа (IndentationError)
Эта ошибка похожа по духу на синтаксическую и является ее подвидом. Тем не менее она возникает только в случае проблем с отступами.
Пример:
for i in range(10):
print('Привет Мир!')
File "", line 2
print('Привет Мир!')
^
IndentationError: expected an indented block
Исключения
Даже если синтаксис в инструкции или само выражение верны, они все равно могут вызывать ошибки при исполнении. Исключения Python — это ошибки, обнаруживаемые при исполнении, но не являющиеся критическими. Скоро вы узнаете, как справляться с ними в программах Python. Объект исключения создается при вызове исключения Python. Если скрипт не обрабатывает исключение явно, программа будет остановлена принудительно.
Программы обычно не обрабатывают исключения, что приводит к подобным сообщениям об ошибке:
Ошибка типа (TypeError)
a = 2
b = 'PythonRu'
a + b
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 a = 2
2 b = 'PythonRu'
----> 3 a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Ошибка деления на ноль (ZeroDivisionError)
10 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
in
----> 1 10 / 0
ZeroDivisionError: division by zero
Есть разные типы исключений в Python и их тип выводится в сообщении: вверху примеры TypeError
и ZeroDivisionError
. Обе строки в сообщениях об ошибке представляют собой имена встроенных исключений Python.
Оставшаяся часть строки с ошибкой предлагает подробности о причине ошибки на основе ее типа.
Теперь рассмотрим встроенные исключения Python.
Встроенные исключения
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
Прежде чем переходить к разбору встроенных исключений быстро вспомним 4 основных компонента обработки исключения, как показано на этой схеме.
Try
: он запускает блок кода, в котором ожидается ошибка.Except
: здесь определяется тип исключения, который ожидается в блокеtry
(встроенный или созданный).Else
: если исключений нет, тогда исполняется этот блок (его можно воспринимать как средство для запуска кода в том случае, если ожидается, что часть кода приведет к исключению).Finally
: вне зависимости от того, будет ли исключение или нет, этот блок кода исполняется всегда.
В следующем разделе руководства больше узнаете об общих типах исключений и научитесь обрабатывать их с помощью инструмента обработки исключения.
Ошибка прерывания с клавиатуры (KeyboardInterrupt)
Исключение KeyboardInterrupt
вызывается при попытке остановить программу с помощью сочетания Ctrl + C
или Ctrl + Z
в командной строке или ядре в Jupyter Notebook. Иногда это происходит неумышленно и подобная обработка поможет избежать подобных ситуаций.
В примере ниже если запустить ячейку и прервать ядро, программа вызовет исключение KeyboardInterrupt
. Теперь обработаем исключение KeyboardInterrupt
.
try:
inp = input()
print('Нажмите Ctrl+C и прервите Kernel:')
except KeyboardInterrupt:
print('Исключение KeyboardInterrupt')
else:
print('Исключений не произошло')
Исключение KeyboardInterrupt
Стандартные ошибки (StandardError)
Рассмотрим некоторые базовые ошибки в программировании.
Арифметические ошибки (ArithmeticError)
- Ошибка деления на ноль (Zero Division);
- Ошибка переполнения (OverFlow);
- Ошибка плавающей точки (Floating Point);
Все перечисленные выше исключения относятся к классу Arithmetic
и вызываются при ошибках в арифметических операциях.
Деление на ноль (ZeroDivisionError)
Когда делитель (второй аргумент операции деления) или знаменатель равны нулю, тогда результатом будет ошибка деления на ноль.
try:
a = 100 / 0
print(a)
except ZeroDivisionError:
print("Исключение ZeroDivisionError." )
else:
print("Успех, нет ошибок!")
Исключение ZeroDivisionError.
Переполнение (OverflowError)
Ошибка переполнение вызывается, когда результат операции выходил за пределы диапазона. Она характерна для целых чисел вне диапазона.
try:
import math
print(math.exp(1000))
except OverflowError:
print("Исключение OverFlow.")
else:
print("Успех, нет ошибок!")
Исключение OverFlow.
Ошибка утверждения (AssertionError)
Когда инструкция утверждения не верна, вызывается ошибка утверждения.
Рассмотрим пример. Предположим, есть две переменные: a
и b
. Их нужно сравнить. Чтобы проверить, равны ли они, необходимо использовать ключевое слово assert
, что приведет к вызову исключения Assertion
в том случае, если выражение будет ложным.
try:
a = 100
b = "PythonRu"
assert a == b
except AssertionError:
print("Исключение AssertionError.")
else:
print("Успех, нет ошибок!")
Исключение AssertionError.
Ошибка атрибута (AttributeError)
При попытке сослаться на несуществующий атрибут программа вернет ошибку атрибута. В следующем примере можно увидеть, что у объекта класса Attributes
нет атрибута с именем attribute
.
class Attributes(obj):
a = 2
print(a)
try:
obj = Attributes()
print(obj.attribute)
except AttributeError:
print("Исключение AttributeError.")
2
Исключение AttributeError.
Ошибка импорта (ModuleNotFoundError)
Ошибка импорта вызывается при попытке импортировать несуществующий (или неспособный загрузиться) модуль в стандартном пути или даже при допущенной ошибке в имени.
import nibabel
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
in
----> 1 import nibabel
ModuleNotFoundError: No module named 'nibabel'
Ошибка поиска (LookupError)
LockupError
выступает базовым классом для исключений, которые происходят, когда key
или index
используются для связывания или последовательность списка/словаря неверна или не существует.
Здесь есть два вида исключений:
- Ошибка индекса (
IndexError
); - Ошибка ключа (
KeyError
);
Ошибка ключа
Если ключа, к которому нужно получить доступ, не оказывается в словаре, вызывается исключение KeyError
.
try:
a = {1:'a', 2:'b', 3:'c'}
print(a[4])
except LookupError:
print("Исключение KeyError.")
else:
print("Успех, нет ошибок!")
Исключение KeyError.
Ошибка индекса
Если пытаться получить доступ к индексу (последовательности) списка, которого не существует в этом списке или находится вне его диапазона, будет вызвана ошибка индекса (IndexError: list index out of range python).
try:
a = ['a', 'b', 'c']
print(a[4])
except LookupError:
print("Исключение IndexError, индекс списка вне диапазона.")
else:
print("Успех, нет ошибок!")
Исключение IndexError, индекс списка вне диапазона.
Ошибка памяти (MemoryError)
Как уже упоминалось, ошибка памяти вызывается, когда операции не хватает памяти для выполнения.
Ошибка имени (NameError)
Ошибка имени возникает, когда локальное или глобальное имя не находится.
В следующем примере переменная ans
не определена. Результатом будет ошибка NameError
.
try:
print(ans)
except NameError:
print("NameError: переменная 'ans' не определена")
else:
print("Успех, нет ошибок!")
NameError: переменная 'ans' не определена
Ошибка выполнения (Runtime Error)
Ошибка «NotImplementedError»
Ошибка выполнения служит базовым классом для ошибки NotImplemented
. Абстрактные методы определенного пользователем класса вызывают это исключение, когда производные методы перезаписывают оригинальный.
class BaseClass(object):
"""Опередляем класс"""
def __init__(self):
super(BaseClass, self).__init__()
def do_something(self):
# функция ничего не делает
raise NotImplementedError(self.__class__.__name__ + '.do_something')
class SubClass(BaseClass):
"""Реализует функцию"""
def do_something(self):
# действительно что-то делает
print(self.__class__.__name__ + ' что-то делает!')
SubClass().do_something()
BaseClass().do_something()
SubClass что-то делает!
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
in
14
15 SubClass().do_something()
---> 16 BaseClass().do_something()
in do_something(self)
5 def do_something(self):
6 # функция ничего не делает
----> 7 raise NotImplementedError(self.__class__.__name__ + '.do_something')
8
9 class SubClass(BaseClass):
NotImplementedError: BaseClass.do_something
Ошибка типа (TypeError)
Ошибка типа вызывается при попытке объединить два несовместимых операнда или объекта.
В примере ниже целое число пытаются добавить к строке, что приводит к ошибке типа.
try:
a = 5
b = "PythonRu"
c = a + b
except TypeError:
print('Исключение TypeError')
else:
print('Успех, нет ошибок!')
Исключение TypeError
Ошибка значения (ValueError)
Ошибка значения вызывается, когда встроенная операция или функция получают аргумент с корректным типом, но недопустимым значением.
В этом примере встроенная операция float
получат аргумент, представляющий собой последовательность символов (значение), что является недопустимым значением для типа: число с плавающей точкой.
try:
print(float('PythonRu'))
except ValueError:
print('ValueError: не удалось преобразовать строку в float: 'PythonRu'')
else:
print('Успех, нет ошибок!')
ValueError: не удалось преобразовать строку в float: 'PythonRu'
Пользовательские исключения в Python
В Python есть много встроенных исключений для использования в программе. Но иногда нужно создавать собственные со своими сообщениями для конкретных целей.
Это можно сделать, создав новый класс, который будет наследовать из класса Exception
в Python.
class UnAcceptedValueError(Exception):
def __init__(self, data):
self.data = data
def __str__(self):
return repr(self.data)
Total_Marks = int(input("Введите общее количество баллов: "))
try:
Num_of_Sections = int(input("Введите количество разделов: "))
if(Num_of_Sections < 1):
raise UnAcceptedValueError("Количество секций не может быть меньше 1")
except UnAcceptedValueError as e:
print("Полученная ошибка:", e.data)
Введите общее количество баллов: 10
Введите количество разделов: 0
Полученная ошибка: Количество секций не может быть меньше 1
В предыдущем примере если ввести что-либо меньше 1, будет вызвано исключение. Многие стандартные исключения имеют собственные исключения, которые вызываются при возникновении проблем в работе их функций.
Недостатки обработки исключений в Python
У использования исключений есть свои побочные эффекты, как, например, то, что программы с блоками try-except работают медленнее, а количество кода возрастает.
Дальше пример, где модуль Python timeit
используется для проверки времени исполнения 2 разных инструкций. В stmt1
для обработки ZeroDivisionError
используется try-except, а в stmt2
— if
. Затем они выполняются 10000 раз с переменной a=0
. Суть в том, чтобы показать разницу во времени исполнения инструкций. Так, stmt1
с обработкой исключений занимает больше времени чем stmt2
, который просто проверяет значение и не делает ничего, если условие не выполнено.
Поэтому стоит ограничить использование обработки исключений в Python и применять его в редких случаях. Например, когда вы не уверены, что будет вводом: целое или число с плавающей точкой, или не уверены, существует ли файл, который нужно открыть.
import timeit
setup="a=0"
stmt1 = '''
try:
b=10/a
except ZeroDivisionError:
pass'''
stmt2 = '''
if a!=0:
b=10/a'''
print("time=",timeit.timeit(stmt1,setup,number=10000))
print("time=",timeit.timeit(stmt2,setup,number=10000))
time= 0.003897680000136461
time= 0.0002797570000439009
Выводы!
Как вы могли увидеть, обработка исключений помогает прервать типичный поток программы с помощью специального механизма, который делает код более отказоустойчивым.
Обработка исключений — один из основных факторов, который делает код готовым к развертыванию. Это простая концепция, построенная всего на 4 блоках: try
выискивает исключения, а except
их обрабатывает.
Очень важно поупражняться в их использовании, чтобы сделать свой код более отказоустойчивым.
Войти или зарегистрироваться
-
Приглашаем вступить в нашу группу ВКонтакте.
Скрыть объявление
-
Присоединяйтесь к нашему чату по ссылке: http://t.me/mediawiki_ru
Скрыть объявление
Группа MediaWiki в Вконтакте
Чат MediaWiki в Telegram
Ошибка Lua: Внутренняя ошибка
Тема в разделе «Для новичков», создана пользователем Ananas, 10 фев 2018.
-
Оффлайн
Ananas
Только зашёл- Регистрация:
- 13 мар 2017
- Сообщения:
- 2
- Симпатии:
- 0
Доброго времени суток. Возникла такая проблема. Импортировал с вики все шаблоны и на примере шаблона Infobox имел LUA ошибку 11. После того, как в локалсеттингс добавил:
$wgScribuntoEngineConf[‘luastandalone’][‘luaPath’] = ‘/usr/bin/lua’;
Ошибка изменилась на:
Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом 127.В чем может быть проблема и как решить?
Спасибо.
Ananas,
10 фев 2018
#1 -
Оффлайн
UksusoFF
Moderator
Команда форума- Регистрация:
- 13 май 2013
- Сообщения:
- 1.718
- Симпатии:
- 204
- Пол:
- Мужской
- Адрес:
- Самара
http://mediawiki.ru/forum/threads/О…dex-field-wikibase-a-nil-value.256/#post-1625
UksusoFF,
10 фев 2018
#2 -
Оффлайн
Ananas
Только зашёл- Регистрация:
- 13 мар 2017
- Сообщения:
- 2
- Симпатии:
- 0
Я пытался и с других вики импортировать нужные инфобоксы, но это не помогает т.к. проблема именно с LUA. Сейчас опять вернулась 11 ошибка.
Ошибка Lua: Внутренняя ошибка: Интерпретатор был остановлен сигналом «11».
Ananas,
13 фев 2018
#3
(Вы должны войти или зарегистрироваться, чтобы ответить.)
Поделиться этой страницей
- Войти через Facebook
- Log in with VK
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
Поиск
-
- Искать только в заголовках
- Сообщения пользователя:
-
Имена участников (разделяйте запятой).
- Новее чем:
-
- Искать только в этой теме
- Искать только в этом разделе
- Отображать результаты в виде тем
-
Быстрый поиск
- Последние сообщения
Больше…