Size: a a a

2019 September 19

СК

Серверный Кит in pro.python
Evgeniy Makarenkov
Здравствуйте. Кто-нибудь работал с cx_Oracle  ?  на простую строку "import cx_Oracle

con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')"  выдается ошибка DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help . Я пользовался мануалом тут : https://stackoverflow.com/questions/46098562/cx-oracle-databaseerror-dpi-1047-64-bit-oracle-client-library-cannot-be-loaded. Но ошибка осталась. Какие именно pre-requisities надо я не понял.  glibc стоит.
мб пушо надо установить либу из репозиториев?
источник
2019 September 24

S

Silent in pro.python
Доброго дня. Не могу понять, в чём проблема.
Имеется файл exp.py с описанием кастомных ошибок:

class CustromExp(Exception):
pass

class NotValid(CustomExp):
def __init__(self, message):
self.message = message


Имеется файл ent.py, в котором есть базовый класс с методами, где эти ошибки raise'ятся:

try:
if data is None:
raise NotValid('No data.')
except NotValid as e:
logger.error(e)
else:
return data


Имеется файл solution.py, где создается инстанс класса, описанный в файле ent.py.

Оборачиваю в try-except-catch блок место, где вызываю метод созданного инстанса и хочу отловить ошибку NotValid уже в файле solution.py. Когда обрабатываю ошибку вида except NotValid as e:, то этот блок просто пропускается (как будто ошибки нет) и уходит в блок else.
источник

VU

Victor Usachev in pro.python
Silent
Доброго дня. Не могу понять, в чём проблема.
Имеется файл exp.py с описанием кастомных ошибок:

class CustromExp(Exception):
pass

class NotValid(CustomExp):
def __init__(self, message):
self.message = message


Имеется файл ent.py, в котором есть базовый класс с методами, где эти ошибки raise'ятся:

try:
if data is None:
raise NotValid('No data.')
except NotValid as e:
logger.error(e)
else:
return data


Имеется файл solution.py, где создается инстанс класса, описанный в файле ent.py.

Оборачиваю в try-except-catch блок место, где вызываю метод созданного инстанса и хочу отловить ошибку NotValid уже в файле solution.py. Когда обрабатываю ошибку вида except NotValid as e:, то этот блок просто пропускается (как будто ошибки нет) и уходит в блок else.
Выложите минимальный рабочий код, где воспроизводится ошибка
источник

S

Silent in pro.python
Victor Usachev
Выложите минимальный рабочий код, где воспроизводится ошибка

# файл exp.py
class CustomExp(Exception):
pass

class NotValid(CustomExp):
def __init__(self, message):
self.message = message

# файл ent.py
class Ent:
def __init__(self, data):
if data is not None:
self.data = data
else:
self.data = None

def sol_1(self):
try:
if data['first'] == 1:
raise ValueError
elif data['second'] == 2:
raise IndexError
elif data['third'] == 3:
raise NotValid('No solution.')
else:
return data
except ValueError:
print('First not valid.')
except IndexError:
print('Second not valid.')
except NotValid as e:
print(e)

# файл solution.py

solver = Ent()
data = {'third': 3, 'second': 'No', 'first': 'alpha'}
try:
solution = solver.sol_1(data)
except NotValid as e:
print(e)
solution = solver.sol_1(data.update({'third': 3 + 5}))
else:
print('Ok')
источник

S

Silent in pro.python
Хотелось бы в файле solution.py обрабатывать иначе кастомную ошибку NotValid, а на другие ошибки оставить обработку в классе Ent
источник

S

Silent in pro.python
Или так в принципе не получится?
источник

VU

Victor Usachev in pro.python
Посмотрите, что вернёт data.update(...)
источник

VU

Victor Usachev in pro.python
Ну и с чего data['third'] должно быть равно 3?
источник

S

Silent in pro.python
Это сугубо левый пример, просто чтобы показать что именно не получается. Основной вопрос именно в обработке ошибок, которые возникают в методе sol_1(): там есть index/value/http/custom ошибки. Хотелось бы обрабатывать только кастомные ошибки, описанные в exp.py, а все другие просто выводить в лог.

Подсказали, что ошибки не нужно было обрабатывать в ent.py, т.е. убрать блок try-except-else. Но тогда, получается, каким образом можно будет отловить другую ошибку, возникшую в методе sol_1? Либо необходимо описать вооообще все ошибки, которые могут возникнуть, и по-разному их обрабатывать в solution.py
источник

VU

Victor Usachev in pro.python
Silent
Это сугубо левый пример, просто чтобы показать что именно не получается. Основной вопрос именно в обработке ошибок, которые возникают в методе sol_1(): там есть index/value/http/custom ошибки. Хотелось бы обрабатывать только кастомные ошибки, описанные в exp.py, а все другие просто выводить в лог.

Подсказали, что ошибки не нужно было обрабатывать в ent.py, т.е. убрать блок try-except-else. Но тогда, получается, каким образом можно будет отловить другую ошибку, возникшую в методе sol_1? Либо необходимо описать вооообще все ошибки, которые могут возникнуть, и по-разному их обрабатывать в solution.py
Я попросил не сугубо левый пример, а пример, на котором Ваш случай воспроизводится.  Проверьте то, что я выше писал.
источник

S

Silent in pro.python
Victor Usachev
Я попросил не сугубо левый пример, а пример, на котором Ваш случай воспроизводится.  Проверьте то, что я выше писал.
# файл exp.py
class CustomExp(Exception):
   pass


class NotValid(CustomExp):
   def init(self, message):
       self.message = message


# файл ent.py
class Ent:
   def init(self):
       pass

   def sol_1(self, url = None):
       if url is not None:
           req_url = url
       else:
           req_url = 'https://api.github.com'
       try:
           resp = requests.get(req_url)

           print(resp.headers)
           resp.raise_for_status()

           if 'X-GitHub-Request-Id' in resp.headers:
               return True
           else:
               raise NotValid('NotValid Error occured.')
       except requests.HTTPError as err:
           print(err)
           return False
       except NotValid as err:
           print(err)
           return 'Error 100001'
       except Exception as err:
           print(err)
           return False


# файл solution.py

solver = Ent()

try:
   solution = solver.sol_1('https://google.com')
   print(solution)
except NotValid as e:
   solution = solver.sol_1('https://api.github.com')
   print(solution)
источник

S

Silent in pro.python
Рабочий пример без data.
Суть: как можно отловить ошибку NotValid в solution.py, не отлавливая другие ошибки. Другими словами, оставить обработку всех ошибок, кроме NotValid, в файле ent.py
источник

VU

Victor Usachev in pro.python
Silent
# файл exp.py
class CustomExp(Exception):
   pass


class NotValid(CustomExp):
   def init(self, message):
       self.message = message


# файл ent.py
class Ent:
   def init(self):
       pass

   def sol_1(self, url = None):
       if url is not None:
           req_url = url
       else:
           req_url = 'https://api.github.com'
       try:
           resp = requests.get(req_url)

           print(resp.headers)
           resp.raise_for_status()

           if 'X-GitHub-Request-Id' in resp.headers:
               return True
           else:
               raise NotValid('NotValid Error occured.')
       except requests.HTTPError as err:
           print(err)
           return False
       except NotValid as err:
           print(err)
           return 'Error 100001'
       except Exception as err:
           print(err)
           return False


# файл solution.py

solver = Ent()

try:
   solution = solver.sol_1('https://google.com')
   print(solution)
except NotValid as e:
   solution = solver.sol_1('https://api.github.com')
   print(solution)
Так зачем Вы это исключение перехватываете в sol_1?
источник

S

Silent in pro.python
😨
источник

S

Silent in pro.python
Всё, теперь вижу...
Да, этого не следовало делать, если хочу обрабатывать в другом месте. В таком случае, необходимо в самом конце убрать и except Exception, ибо туда это исключение всё равно перейдет. Получается, чтобы этого не произошло, необходимо обработать все мыслимые ошибки, которые могут произойти в блоке try метода sol_1, за исключением собственных исключений?
источник

VU

Victor Usachev in pro.python
Silent
Всё, теперь вижу...
Да, этого не следовало делать, если хочу обрабатывать в другом месте. В таком случае, необходимо в самом конце убрать и except Exception, ибо туда это исключение всё равно перейдет. Получается, чтобы этого не произошло, необходимо обработать все мыслимые ошибки, которые могут произойти в блоке try метода sol_1, за исключением собственных исключений?
Конечно
источник

S

Silent in pro.python
Victor Usachev
Конечно
Я, к сожалению, до сих пор не встречал мест в разных исходниках, где обрабатывается много исключений, условно, обработка на 100+ строк. Какие-то плохие сорцы находил, или применяются какие-то другие подходы?
источник

VU

Victor Usachev in pro.python
Silent
Я, к сожалению, до сих пор не встречал мест в разных исходниках, где обрабатывается много исключений, условно, обработка на 100+ строк. Какие-то плохие сорцы находил, или применяются какие-то другие подходы?
Слишком общий вопрос.
источник

VU

Victor Usachev in pro.python
Обычные подходы, просто не нужно писать простыни кода, разделяйте логически
источник

S

Silent in pro.python
Victor Usachev
Обычные подходы, просто не нужно писать простыни кода, разделяйте логически
Хорошо, буду пробовать. Спасибо за помощь
источник