Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2020 16:41:16

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Отловить исключение

Добрый день.
Слежу за появлениями исключения в базе. При стабильной связи все хорошо. Проблема возникает при потере связи с базой и происходит остановка работы скрипта. Запуск скрипта с отключенной сетью проходит корректно, после подключения сети скрипт остается работающим
Как правильно отловить исключение и перезапустить процесс при пропадание сети (связи с базой)?.

 # -*- coding: utf-8 -*-
import smtplib
import fdb
import os
import threading
import _thread
from email.mime.text import MIMEText
from email.header import Header
def send_m(s):
        HOST = "......................"
        smtp_port=25
        smtpObj = smtplib.SMTP(HOST, smtp_port)
        msg = MIMEText(s, 'plain', 'utf-8')
        msg['To'] = ".............."
        msg['From'] = ".........."
        msg['Subject'] = Header("............", 'utf-8')
        smtpObj.send_message(msg)
       
def DB():
        con = fdb.connect(dsn='............')
        return con
def Start1():
    try:
        print("Start")
        con=DB()
        conduit = con.event_conduit( ['EVENTS1','EVENTS2'] )
        conduit.begin()
        e = conduit.wait()
        print (e)
        if e['EVENTS1']==1:
                        cur = con.cursor()
                        SELECT = ".............................."
                        cur.execute(SELECT)
                        rows = cur.fetchall()
                        msg_t='.........................'
                        print (msg_t)
                        send_m(msg_t)
        if e['EVENTS2']==1:
                        cur = con.cursor()
                        SELECT = "..............."
                        cur.execute(SELECT)
                        rows = cur.fetchall()
                        msg_t='........................'
                        print (msg_t)
                        send_m(msg_t)
        
        return conduit
    except:
            print("wait")
            pass
def main():
        while True:
            try:
                print("Начало")
                conduit=Start1()
            except Exception:
                pass
                print("Repear")
                conduit.close()
    
 
if __name__== '__main__':
 while True:
    try:
        main()
    except:
        pass
        print("Repair1")
  

Ошибка при отключение сети

Exception in thread Thread-1:
Traceback (most recent call last):
File “C:\Python\Python37\lib\threading.py”, line 926, in _bootstrap_inner
self.run()
File “C:\Python\Python37\lib\threading.py”, line 870, in run
self._target(*self._args, **self._kwargs)
File “C:\Python\Python37\lib\site-packages\fdb\fbcore.py”, line 2154, in event_process
events = data.count_and_reregister()
File “C:\Python\Python37\lib\site-packages\fdb\fbcore.py”, line 2079, in count_and_reregister
self.__wait_for_events()
File “C:\Python\Python37\lib\site-packages\fdb\fbcore.py”, line 2065, in __wait_for_events
“Error while waiting for events:”)
fdb.fbcore.DatabaseError: ('Error while waiting for events:\n- SQLCODE: 0\n- unknown ISC error 0', 0, 0)

Офлайн

#2 Сен. 24, 2020 17:13:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отловить исключение

alexey_gh
Какой-то странный ваш код

 def main():
        while True:
            try:
                conduit=Start1()
            except Exception:
                pass
                conduit.close()
то есть вы закрываете соединение, только если произошла ошибка. Вы в цикле бесконечно создаете соединения с базой, а почему вы их не закрываете? Не говоря уже о том, что после pass вообще код не выполнится (то есть соединения вы не закрываете никогда, даже при произошедшей ошибке).



Офлайн

#3 Сен. 25, 2020 09:23:39

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Отловить исключение

FishHook
alexey_ghКакой-то странный ваш код
Это код уже от без исходности, никак я не могу отловить исключение в потоке. которое создается для прослушивания события из базы. По этому везде уже понаставил try… execpt но в них не залетает это исключение.

Офлайн

#4 Сен. 25, 2020 11:03:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Отловить исключение

alexey_gh
никак я не могу отловить исключение в потоке
В каком потоке?

Если вот это fdb.fbcore.DatabaseError возникает, то его и надо отлавливать.



Офлайн

#5 Сен. 25, 2020 15:41:09

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Отловить исключение

py.user.next
Exception in thread Thread-1:……

это разве не исключение возникшее потоке?

Поправьте меня, как мне тогда отловить исключение fdb.fbcore.DatabaseError если except: должен отловить все исключения, но оно пролетает мимо.

Офлайн

#6 Сен. 25, 2020 18:31:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отловить исключение

alexey_gh
Поправьте меня, как мне тогда отловить исключение fdb.fbcore.DatabaseError если except: должен отловить все исключения, но оно пролетает мимо.

             try:
                conduit=Start1()
            except Exception:
                conduit.close()
вы отлавливаете не все исключения, а исключения отнаследованные от класса Exception.



Офлайн

#7 Сен. 25, 2020 20:13:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Отловить исключение

alexey_gh
Exception in thread Thread-1:……
И где Thread-1 в этом коде, который ты выложил?

Ты лучше его сотри и напиши заново с нуля, отлаживая по шагам. А затычки, расставленные по всему коду, как видишь, не только не помогают, но ещё и код превратили в свалку.



Отредактировано py.user.next (Сен. 25, 2020 20:15:45)

Офлайн

#8 Сен. 28, 2020 11:02:06

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Отловить исключение

 # -*- coding: utf-8 -*-
import smtplib
import fdb
import os
import threading
import _thread
from email.mime.text import MIMEText
from email.header import Header
def send_m(s):
        HOST = "......................"
        smtp_port=25
        smtpObj = smtplib.SMTP(HOST, smtp_port)
        msg = MIMEText(s, 'plain', 'utf-8')
        msg['To'] = ".............."
        msg['From'] = ".........."
        msg['Subject'] = Header("............", 'utf-8')
        smtpObj.send_message(msg)
       
def DB():
        con = fdb.connect(dsn='............')
        return con
def Start1():
    try:
        print("Start")
        con=DB()
        conduit = con.event_conduit( ['EVENTS1','EVENTS2'] )
        conduit.begin()
        e = conduit.wait()
        print (e)
        if e['EVENTS1']==1:
                        cur = con.cursor()
                        SELECT = ".............................."
                        cur.execute(SELECT)
                        rows = cur.fetchall()
                        msg_t='.........................'
                        print (msg_t)
                        send_m(msg_t)
        if e['EVENTS2']==1:
                        cur = con.cursor()
                        SELECT = "..............."
                        cur.execute(SELECT)
                        rows = cur.fetchall()
                        msg_t='........................'
                        print (msg_t)
                        send_m(msg_t)
        
        return conduit
    except:
            print("wait")
def main():
        while True:
            try:
                print("Начало")
                conduit=Start1()
            except:
                print("Repear")
                conduit.close()
    
 
if __name__== '__main__':
 while True:
    try:
        main()
    except:
        print("Repair1")

При нормально работе (есть связь)
вывод программы
 Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
================ RESTART: C:\python\weight.py ===============
Начало
Start

При выполнение скрипта. отключаю сеть
 Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
================ RESTART: C:\python\weight.py ===============
Начало
Start
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python\Python37\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
  File "C:\Python\Python37\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python\Python37\lib\site-packages\fdb\fbcore.py", line 2154, in event_process
    events = data.count_and_reregister()
  File "C:\Python\Python37\lib\site-packages\fdb\fbcore.py", line 2079, in count_and_reregister
    self.__wait_for_events()
  File "C:\Python\Python37\lib\site-packages\fdb\fbcore.py", line 2065, in __wait_for_events
    "Error while waiting for events:")
fdb.fbcore.DatabaseError: ('Error while waiting for events:\n- SQLCODE: 0\n- unknown ISC error 0', 0, 0)

Для меня проблема в том что я не могу корректно обработать этот разрыв. Данное событие не попадает в исключение

Отредактировано alexey_gh (Сен. 28, 2020 11:02:57)

Офлайн

#9 Сен. 28, 2020 12:41:28

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Отловить исключение

Ты всё это в IDE запускаешь или как?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#10 Сен. 28, 2020 14:56:38

alexey_gh
Зарегистрирован: 2017-03-09
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Отловить исключение

Rodegast
Ты всё это в IDE запускаешь или как?
да. скрипт запускаю в IDLE

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version