Вывод ошибки pyqt5

Assuming you are in a QWidget from which you want to display an error message, you can simply use QMessageBox.critical(self, "Title", "Message"), replace self by another (main widget for example) if you are not is a QWidget class.


Edit: even if you are not in a QWidget (or don’t want to inherit from it), you can just use None as parent with for instance QMessageBox.critical(None, "Title", "Message").


Edit, here is an example of how to use it:

# -*-coding:utf-8 -*

from PyQt5.QtWidgets import QApplication, QMessageBox
import sys

# In this example, success is False by default, and
#  - If you press Cancel, it will ends with False,
#  - If you press Retry until i = 3, it will end with True


expectedVal = 3


def MyFunction(val: int) -> bool:
    return val == expectedVal


app = QApplication(sys.argv)
i = 1
success = MyFunction(i)
while not success:
    # Popup with several buttons, manage below depending on choice
    choice = QMessageBox.critical(None,
                                  "Error",
                                  "i ({}) is not expected val ({})".format(i, expectedVal),
                                  QMessageBox.Retry | QMessageBox.Cancel)
    if choice == QMessageBox.Retry:
        i += 1
        print("Retry with i = {}".format(i))
        success = MyFunction(i)
    else:
        print("Cancel")
        break

if success:
    # Standard popup with only OK button
    QMessageBox.information(None, "Result", "Success is {}".format(success))
else:
    # Standard popup with only OK button
    QMessageBox.critical(None, "Result", "Success is {}".format(success))

Вы должны использовать excepthook,
и если вы хотите, чтобы событие завершилось, вы должны вызвать метод quit().

import sys
import traceback
from PyQt5 import QtWidgets, QtGui, QtCore


class ErrorApp(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        bar = self.menuBar()
        menu = bar.addMenu('&Menu')

        action_raise = QtWidgets.QAction("Raise", self)
        action_exit = QtWidgets.QAction("Exit", self)
        menu.addAction(action_raise)
        menu.addAction(action_exit)

        action_exit.triggered.connect(self.quit_trigger)
        action_raise.triggered.connect(self.raise_error)

    def raise_error(self):
        aa = 5 / 0                                        # какая-то ошибка           

    def quit_trigger(self):
        QtWidgets.qApp.quit()



def excepthook(exc_type, exc_value, exc_tb):
    tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
    print("Oбнаружена ошибка !:", tb)
#    QtWidgets.QApplication.quit()             # !!! если вы хотите, чтобы событие завершилось


sys.excepthook = excepthook

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    w = ErrorApp()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

Александр Рублев

@Meller008

Если я правильно понял вопрос, то например

if error:
    QMessageBox.critical(self, "Ошибка ", "Выделите элемент который хотите изменить", QMessageBox.Ok)

Ответ написан

более трёх лет назад


Комментировать


Комментировать

Уведомления

  • Начало
  • » Python для новичков
  • » Вывод ошибки от PyQt5 в консоль

#1 Авг. 1, 2017 09:41:14

Вывод ошибки от PyQt5 в консоль

При использовании PyQt5, например при нажатии кнопки к которой привязана функция, если что-либо в ней (функции) идет не так — программа “падает” и ничего не выдается об ошибке в консоль IDE (в моем случае PyCharm), возможно кто знает, как это исправить?

upd (решение):

https://stackoverflow.com/questions/34363552/python-process-finished-with-exit-code-1-when-using-pycharm-and-pyqt5

 # Back up the reference to the exceptionhook
sys._excepthook = sys.excepthook
def my_exception_hook(exctype, value, traceback):
    # Print the error and traceback
    print(exctype, value, traceback)
    # Call the normal Exception hook after
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)
# Set the exception hook to our wrapping function
sys.excepthook = my_exception_hook
 try:
    sys.exit(app.exec_())
except:
    print("Exiting")

Отредактировано gmaksim (Авг. 1, 2017 12:37:16)

Офлайн

  • Пожаловаться

#2 Авг. 1, 2017 10:24:29

Вывод ошибки от PyQt5 в консоль

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

Офлайн

  • Пожаловаться

#3 Авг. 1, 2017 10:25:54

Вывод ошибки от PyQt5 в консоль

Хотя, может быть просто не туда глядите

Офлайн

  • Пожаловаться

#4 Авг. 1, 2017 10:39:43

Вывод ошибки от PyQt5 в консоль

Да как бы не так.
print в функциях работают и выдают информацию (“навесил” для теста). Пример работы консоли и “падения” программы в приложении.

По коду — вызывается класс, в классе идут методы один за другим, в них вызывается GUI другими методами с разными параметрами. Есть метод для сохранения данных в БД, вот там и падает, и это точно какая-то особенность использования в качестве GUI — PyQt5 — так как при использовании tkinter — условно при нажатии кнопки запуска функции сохранения в БД в консоль выводило ошибку, почему она не срабатывала, тут же просто “падает”.

Отредактировано gmaksim (Авг. 1, 2017 10:43:56)

Прикреплённый файлы:
attachment 2.PNG (18,8 KБ)

Офлайн

  • Пожаловаться

#5 Авг. 1, 2017 10:47:32

Вывод ошибки от PyQt5 в консоль

gmaksim
При использовании PyQt5, например при нажатии кнопки к которой привязана функция, если что-либо в ней (функции) идет не так — программа “падает” и ничего не выдается об ошибке в консоль IDE (в моем случае PyCharm), возможно кто знает, как это исправить?
Онлайн

есть такое и именно в PyQt5. это особенность сборки походу, в С++ такое бывает при сегфолте или нуль-пойнтере. можно из терминала запускать типа python -v my_script

Офлайн

  • Пожаловаться

#6 Авг. 1, 2017 10:57:29

Вывод ошибки от PyQt5 в консоль

gmaksim
Ну блин, вы так вопрос задаете “ничего не выдается об ошибке в консоль IDE” как будто у вас нет сообщения об ошибке именно в терминале пайшарма, а другом терминале — все нормально.
PyQt — это набор питоньих обвязок над бинарниками Qt, если что-то “падает” при выполнении этого бинарного кода мы никогда не получим питоньего трейсбэка. Просто, примите это как должное.

Офлайн

  • Пожаловаться

#7 Авг. 1, 2017 11:17:21

Вывод ошибки от PyQt5 в консоль

vic57
есть такое и именно в PyQt5. это особенность сборки походу, в С++ такое бывает при сегфолте или нуль-пойнтере. можно из терминала запускать типа python -v my_script

Получилось, только теперь падает на строчке:

conn = sqlite3.connect(‘DATA//db.sqlite’)
sqlite3.OperationalError: unable to open database file

Наверно надо поменять на абсолютный путь?

FishHook
PyQt — это набор питоньих обвязок над бинарниками Qt, если что-то “падает” при выполнении этого бинарного кода мы никогда не получим питоньего трейсбэка. Просто, примите это как должное.

Как-то так и думал, но надеялся, что может есть пути обхода.
python -v my_script похоже на то.

Отредактировано gmaksim (Авг. 1, 2017 11:17:55)

Офлайн

  • Пожаловаться

#8 Авг. 1, 2017 11:20:42

Вывод ошибки от PyQt5 в консоль

gmaksim
sqlite3.OperationalError: unable to open database file

это уже не Qt ошибка

Офлайн

  • Пожаловаться

#9 Авг. 1, 2017 11:36:42

Вывод ошибки от PyQt5 в консоль

vic57
это уже не Qt ошибка

Угу, я и не имел ввиду, что это Qt ошибка, разобрался, действительно все выводит. Еще раз спасибо.

FishHook
Однако ‘python -v my_script’ (из терминала) все отлавливает (перед “падением”).

Отредактировано gmaksim (Авг. 1, 2017 11:37:10)

Офлайн

  • Пожаловаться

#10 Авг. 1, 2017 11:41:23

Вывод ошибки от PyQt5 в консоль

gmaksim
действительно все отлавливает

Что “всё”? Вы же понимаете, что невозможно показать построчный вывод ошибки в скомпилированной сишной библиотеке. Ваша ошибка возникает явно в питоньем коде, поэтому она и отлавливается.

Офлайн

  • Пожаловаться

  • Начало
  • » Python для новичков
  • » Вывод ошибки от PyQt5 в консоль

0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

1

12.05.2017, 03:58. Показов 6682. Ответов 10


Студворк — интернет-сервис помощи студентам

PyQt5 при возникновении ошибки просто завершает работу программы, а хотелось бы посмотреть что ему не понравилось…
Как включить отображение ошибок?
(а то я скоро экстрасенсом стану)



0



2740 / 2339 / 620

Регистрация: 19.03.2012

Сообщений: 8,830

12.05.2017, 05:19

2

Глобальный перехватчик делаешь в месте запуска программы и в обработчике показываешь ошибку возникшую, а потом закрываешь прогу.



0



kak_ivan

0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

13.05.2017, 02:17

 [ТС]

3

Цитата
Сообщение от alex925
Посмотреть сообщение

Глобальный перехватчик делаешь в месте запуска программы

Если так, то не работает(

Python
1
2
3
4
5
6
7
8
9
10
11
if __name__ == "__main__":
    import sys
    try:
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    except Exception as e:
        raise e



0



2740 / 2339 / 620

Регистрация: 19.03.2012

Сообщений: 8,830

13.05.2017, 10:12

4

kak_ivan, так ты тут и не делаешь отображения ошибки. Ты ее поймал и опять кинул дальше.



0



kak_ivan

0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

13.05.2017, 21:58

 [ТС]

5

Цитата
Сообщение от alex925
Посмотреть сообщение

так ты тут и не делаешь отображения ошибки.

http://pep8.ru/doc/tutorial-2.6/9.html

Оператор raise позволяет программисту принудительно породить исключение. Например:

Python
1
2
3
4
>>> raise NameError, 'ПриветТам'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: ПриветТам

Я принудительно порождаю исключение которое отловил try:except:
А так как это не работает, значит исключение не возникает…

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



0



2740 / 2339 / 620

Регистрация: 19.03.2012

Сообщений: 8,830

14.05.2017, 18:21

6

kak_ivan, raise возбуждает ошибку, с этим ни кто не спорит, но то, что ты делаешь называется дичь. Ты отлавливаешь ошибку и потом опять ее кидаешь дальше (причем кидаешь не правильно, нужно писать просто raise если хочешь кинуть ошибку дальше). То есть ты написал бесполезный обработчик ошибки, который НИКАК​ не влияет на ход исполнения программы.

Если хочешь увидеть​ ошибку в гуи, то создай message box и туда пиши ошибку.



0



0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

15.05.2017, 03:41

 [ТС]

7

Цитата
Сообщение от alex925
Посмотреть сообщение

Если хочешь увидеть​ ошибку в гуи, то создай message box и туда пиши ошибку.

Ну хоть что-то полезное сказал, спасибо)



0



2740 / 2339 / 620

Регистрация: 19.03.2012

Сообщений: 8,830

15.05.2017, 05:56

8

kak_ivan, я это сказал тебе ещё в самом начале.

Если было непонятно как вывести ошибку, надо было это переспросить и все.



0



0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

15.05.2017, 07:35

 [ТС]

9

Цитата
Сообщение от alex925
Посмотреть сообщение

Если было непонятно как вывести ошибку, надо было это переспросить


Переспрашиваю



0



alex925

2740 / 2339 / 620

Регистрация: 19.03.2012

Сообщений: 8,830

15.05.2017, 20:18

10

красивый способ

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import sys
 
from PyQt5 import QtWidgets
 
 
class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setLayout(QtWidgets.QHBoxLayout())
 
        but = QtWidgets.QPushButton('Нажми меня')
        self.layout().addWidget(but)
        but.clicked.connect(self.error)
 
    def error(self):
        raise Exception('Неожиданная ошибкочка')
 
 
def my_excepthook(type, value, tback):
    QtWidgets.QMessageBox.critical(
        window, "CRITICAL ERROR", str(value),
        QtWidgets.QMessageBox.Cancel
    )
 
    sys.__excepthook__(type, value, tback)
 
 
sys.excepthook = my_excepthook
 
app = QtWidgets.QApplication([])
window = MainWindow()
window.show()
app.exec_()



2



kak_ivan

0 / 0 / 1

Регистрация: 03.02.2015

Сообщений: 81

16.05.2017, 06:56

 [ТС]

11

Цитата
Сообщение от alex925
Посмотреть сообщение

def error(self):
* * * * raise Exception(‘Неожиданная ошибкочка’)

Очень благодарен)
А как кинуть возникшую ошибку?

И как ее перехватить?
Например, на этом коде:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
 
 
class Example(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
 
 
    def initUI(self):
 
        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)
 
        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)
 
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)
 
        self.statusBar()
 
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()
 
 
    def buttonClicked(self):
 
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' was pressed')
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())



0



Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Вывод ошибки mail php
  • Вывод ошибки golang
  • Вывод ошибки discord py
  • Вывод маток никот ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии