Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/64: Рейтинг темы: голосов - 64, средняя оценка - 4.95
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171

Как узнать имя исключения в Python , для объекта webdriver, для секции try/except

07.08.2017, 02:27. Показов 14546. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствовать и болеть )))
Ребят
--1-- как узнать конкретное имя исключения для объекта?
--2-- как пустить трафик от прокси №1 через прокси №2
в моем случае от проксик №1 - browsermobproxy , через проксик №2 - burpsuite

само исключение хочу поставить на "событие" - firefox.close(), когда скрипт запускаю , скрипт запускает браузер firefox и если браузер сразу закрыть то вываливается Traceback :

[I]Traceback (most recent call last):
File "ffstart.py", line 126, in <module>
A.start_firefox_url('http://www.google.ru')
File "ffstart.py", line 89, in start_firefox_url
self.driver.get(self.url)
File "/home/sirius/project/python_sir/SBBs_sdo/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 268, in get
self.execute(Command.GET, {'url': url})
File "/home/sirius/project/python_sir/SBBs_sdo/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
self.error_handler.check_response(respon se)
File "/home/sirius/project/python_sir/SBBs_sdo/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverExce ption: Message: Failed to decode response from marionette
[/I]


сам код.
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
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python3
import sys
import requests
from selenium.webdriver.common.proxy import * # эта бибилиотека нужна ждя пуска мозилы через порт 8080
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from browsermobproxy  import Server, Client # попробую реализовать схему: вызов скрипта ->  firefox->browsermobproxy->burpsuite
 
class BMP_FF():
    """
    Класс для работы браузера Firefox через прокси browsermobproxy
    для перехвата и анализа Get запросов (перехват Get requests not implemention)
    допилить обработку исключения (преждевременного  закрытия Firefox)
    """
 
    try:
        def __init__(self):
            """путь прописывать полностью от home до бинарника который скачивается отдельно не через pip install"""
            self.bmpproxy = Server(r'//home//sirius//project//python_sir//SBBs_sdo//lib//python3.5//site-packages//browsermob-proxy//bin//browsermob-proxy',{'port':8082})# указываю  путь к  бинарнику и на каком порту слушать трафик
            self.bmpproxy.start() # start browsermobproxy
            self.bmp_port = self.bmpproxy.create_proxy() # save № open port browsermobproxy
            self.resp = requests.post('http://localhost:8082/proxy',{})# отправляю запрос для получения №порта на котором поднял проксик browsermobproxy
            port = self.resp.json()['port']
            self.port_ff_net = "localhost :" + str(port) 
            self.proxy_my_ff = Proxy({
                'proxyType' : ProxyType.MANUAL,
                'httpProxy' : self.port_ff_net,
                'ftpProxy'  : self.port_ff_net,
                'sslProxy'  : self.port_ff_net,
                'socksProxy': self.port_ff_net,
                'noProxy'   : ''
            })
            self.profile = webdriver.FirefoxProfile()
            self.profile.set_preference("network.proxy.type" , 1)
            self.profile.set_preference("network.proxy.http" , "localhost")
            self.profile.set_preference("network.proxy.http_port" , self.bmp_port)
            self.profile.set_proxy(self.proxy_my_ff)
         
        """метод вызова браузера с заданными  настройками прокси в
        методе  __init__ и переход на заданный адрес"""
        def start_firefox_url(self,site_url): #site_url адрес нужного сайта
            self.url = site_url
            self.driver = webdriver.Firefox(self.profile)
            self.driver.get(self.url)
            sys.stdout.write('Открылся порт = ' + str(self.resp.json()['port']) + '\n' )
 
        """метод отстановки browsermobproxy"""
        def bmp_stop(self):
            self.bmpproxy.stop()
 
    except Exception as msg:
        sys.stdout.write(msg[2])
        sys.stdout.write('Что то пошло не так в объекте BMP_FF' + '\n' )
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.08.2017, 02:27
Ответы с готовыми решениями:

Selenium webdriver как узнать имя фрейма
Нужная мне страница после нажатия кнопки AJAX-ом подгружает данные. Если в Хроме на эти данные навестись то можно посмотреть код фрейма (по...

Как узнать имя объекта?
Сабж. у меня динамические едиты и событие к ним OnChange одно хочу сделать, но без имени объекта никак

Исключения и Имя объекта
Сейчас работаю с классами и возник вопрос, есть какой-то шаблонный класс template&lt;typename T&gt; class ClassName{...} В нем есть класс...

15
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.08.2017, 06:43
Python
1
selenium.common.exceptions.WebDriverException
Не?
Python
1
2
3
4
5
6
from selenium.common.exceptions import WebDriverException
 
try:
    #...
except WebDriverException as e:
    #...
Добавлено через 1 минуту
И ещё, оборачивайте блоками try-except методы, а не вообще всё. Понимаю, питон гибкий, всё стерпит...
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
08.08.2017, 02:34  [ТС]
Спасибо Рыжий Лис за оба совета!!!
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
08.08.2017, 10:12
Цитата Сообщение от Orakul Посмотреть сообщение
как узнать конкретное имя исключения для объекта?
Я обычно сначала даю коду упасть в ошибку. Тогда в консоли будет написано исключение.
Вот я его и беру в обработку.

Другой путь - ковырять документацию заранее. Мне этот путь не нравится. И даже если я знаю, какое исключение там будет выброшено, я все равно предпочитаю увидеть это своими глазами, а не строить догадки..
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.08.2017, 11:27
Kifsif, некоторых исключений при разработке ты можешь не поймать, а на проде все рухнет. Выводы делать не буду и так все очевидно.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
08.08.2017, 11:50
Цитата Сообщение от alex925 Посмотреть сообщение
Kifsif, некоторых исключений при разработке ты можешь не поймать, а на проде все рухнет.
Если при разработке мы о чем-то не подумали, то в продакшене - да выскочит ошибка. Это, во-первых, неизбежно. Ошибки есть у всех. Баги правятся, жизнь продолжается.

Во-вторых - да, я хочу, при разработке видеть, как оно упало. Потом принять к сведению и написать обработчик. Мне так нравится. И не только мне. Вон TDD есть - им тоже нравится посмотреть сперва, как оно упало, а потом двигаться дальше.

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

Это скриптовый язык - запустил, проверил. Видишь возможное исключение, дал ему сначала взорваться, потом обработал.
На компилируемых могут быть другие стратегии, я не знаю. Компиляция долго происходить может. Я не программировал профессионально на компилируемых, а студенческие работы не в счет.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.08.2017, 13:04
Цитата Сообщение от Kifsif Посмотреть сообщение
Во-вторых - да, я хочу, при разработке видеть, как оно упало
Веди логи и все, можешь сохранять полный traceback в лог.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
08.08.2017, 13:47
Цитата Сообщение от alex925 Посмотреть сообщение
Веди логи и все, можешь сохранять полный traceback в лог.
Я с такой техникой не знаком. Зачем логи в разработке на Питоне?
В разработке мы оперируем срочной информацией. Вот оно упало - посмотрели, организовали обработчик исключений.

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

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

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

А еще давным давно мужики кодили на бумажке. Потом отдавали оператору. Оператор вбивал на перфокарты. Потом программист ждал освобождения машинного времени. Его перфокарты прогоняли. Он приходил. А там написано: "Ошибка компиляции". И он уходил думать. И думал опять на бумажке, опять наборщик и т.п.

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

Давайте все-таки определимся, почему Вы не хотите дать упасть в ошибку? Из этиж же самых соображений, что продуктивность программиста снизится из-за постоянных запусков?

Но как она может снизиться. Это же не компиляция. А на узнавание исключения в документации Вы все равно время потратите.

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

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

В общем, был бы признателен за более подробный комментарий: почему вы против того, чтобы давать упасть, а только потом обрабатывать исключение.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.08.2017, 14:55
Самый глупый способ поймать исключение, который я когда-либо видел:
Python
1
2
3
4
5
6
7
8
try:
    def test(x,y):
        print(x/y)
 
except Exception as err:
    print('Ошибка никогда не будет перехвачена просто потому, что здесь определение функции, а не вызов:',err)
    
test(1,0)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.08.2017, 19:06
Цитата Сообщение от Kifsif Посмотреть сообщение
В общем, был бы признателен за более подробный комментарий: почему вы против того, чтобы давать упасть, а только потом обрабатывать исключение.
Мне если честно лень писать тебе сочинения на n количество страниц, потому что мы говорим про очень глупые и очевидные вещи.
Ты просто представь если бы сбербанк-онлайн (или любая другая крупная система) падала по поводу и без, просто потому, что программист поленился написать нормальный код и не обработал пару-другую исключений. Я думаю ты таким софтом не стал бы пользоваться. Отсюда делай выводы...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.08.2017, 19:21
Цитата Сообщение от Kifsif Посмотреть сообщение
И более никогда - потому что мы проехали и уже не хотим вспоминать, что мы кодили даже час назад.
Вот тоже не соглашусь с таким подходом. Свои скрипты я поддерживаю исключительно сам (если б не сам, может и наплевал бы, хотя совесть все равно не позволяет, зараза) и поэтому лог это то, с чем я работаю, когда клиент пишет, что вот "че-то не работает". А чего именно: откуда он знает? Зато знает лог, который клиент мне дает. А если скрипт его не будет вести - с чем мне работать? Запускать скрипт на полный тест? Может уйти много времени пока случится тоже самое, что случилось у клиента.
И совершенно верно что,
Цитата Сообщение от Kifsif Посмотреть сообщение
если при разработке мы о чем-то не подумали, то в продакшене - да выскочит ошибка. Это, во-первых, неизбежно. Ошибки есть у всех.
Но
Цитата Сообщение от Kifsif Посмотреть сообщение
Баги правятся, жизнь продолжается.
И гораздо веселее это происходит, если все залогировано :-).
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
08.08.2017, 21:22
Цитата Сообщение от Kifsif Посмотреть сообщение
Если при разработке мы о чем-то не подумали, то в продакшене - да выскочит ошибка.
Да выскочит, но при твоем подходе их будет +100500 и ты даже знать не будешь почему они возникли, а при правильном подходе их будет в разы меньше + можно будет отловить баги с помощью логов.

Цитата Сообщение от Kifsif Посмотреть сообщение
Я с такой техникой не знаком.
Это говорит, что ты мало пока знаешь, это возможности стандартной библиотеки.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
08.08.2017, 22:28
Garry Galler, я говорил про среду разработки, а вы говорите про продуктивную. В продуктивной среде логи ведутся - это понятно.
Но топикстартер спрашивал, как ему в момент разработки узнать, какое нужно обрабатывать исключение.
Речь вообще про webdriver шла.

alex925, зачем лог смотреть в момент разработки? Мы говорим только о разработке. Как тут лог может помочь?

Цитата Сообщение от alex925 Посмотреть сообщение
Мне если честно лень писать тебе сочинения на n количество страниц, потому что мы говорим про очень глупые и очевидные вещи.
А вот и не надо писать. Если методика разработки через анализ логов вне продуктивной среды, то о ней уже написано. Ссылки будет достаточно.
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
09.08.2017, 02:07  [ТС]
Ребят а как правильнее будет использовать блоки try/except , поделитесь своим опытом!!! Представляю вашему вниманию два варианта обработки исключений один в классе BMP_FF() , другой вариант за классом (подтолкнул комментарий мистера Garry Galler ):
--1--
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env python3
import sys
import requests
from selenium.webdriver.common.proxy import * # эта бибилиотека нужна ждя пуска мозилы через порт 8080
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
from browsermobproxy  import Server, Client # попробую реализовать схему скрипт firefox->browsermobproxy->burpsuite
 
 
#====================================================================================
class Config_firefox_start():
    """
    Без этих настроек proxy firefox не запускался 
    через Burpsuite т.к настройки в запускаемой копии 
    firefox настраивались по умолчанию на работу без прокси .
  
    """
    
    def __init__(self,link_url): # link_url при создании обЪекта передаю нужный адрес сайта
        self.url      = link_url # link_url хранит адрес сайта который нужен для перехода
 
        """ настройка вкладки "Сеть" запускаемого браузера"""
        self.myProxy  = "localhost:8081"
        self.proxy_my = Proxy({
        'proxyType'   : ProxyType.MANUAL,
        'httpProxy'   : self.myProxy,
        'ftpProxy'    : self.myProxy,
        'sslProxy'    : self.myProxy,
        'socksProxy'  : self.myProxy,   
        'noProxy'     : '' # set this value as desired
        })
    
        self.profile = webdriver.FirefoxProfile()
        self.profile.set_preference("network.proxy.type", 1)
        self.profile.set_preference("network.proxy.http", "localhost")
        self.profile.set_preference("network.proxy.http_port", 8081)
        self.profile.set_proxy(self.proxy_my)
 
        """Запуск браузера с настроенными настройками(prifile)и переход на сайт"""
        self.driver = webdriver.Firefox(self.profile)
        self.driver.get(self.url)
 
#==================================================================================
 
class BMP_FF():
    """
    Класс для работы браузера Firefox через прокси browsermobproxy
    для перехвата и анализа Get запросов (перехват Get requests not implemention)
    допилить обработку исключения (преждевременного  закрытия Firefox)
    """
 
    def __init__(self):
        """инициализация настроек браузера Firefox для работы через прокси"""
        #путь прописывать полностью от home до бинарника который скачивается отдельно не через pip install
        self.bmpproxy = Server(r'//home//sirius//project//python_sir//SBBs_sdo//lib//python3.5//site-packages//browsermob-proxy//bin//browsermob-proxy',{'port':8082}) # указываю  путь к  бинарнику и на каком порту слушать трафик
        self.bmpproxy.start() # start browsermobproxy
        self.bmp_port = self.bmpproxy.create_proxy() # save № open port на  котором browsermobproxy ловит трафик от firefox
        self.resp = requests.post('http://localhost:8082/proxy',{}) # отправляю запрос для получения №порта на котором поднял проксик browsermobproxy
        port = self.resp.json()['port'] # назначение порта пока не знаю 
        self.port_ff_net = "localhost :" + str(self.bmp_port.port) # получаю строку типа "localhost : 8082"
 
        self.proxy_my_ff = Proxy({
            'proxyType' : ProxyType.MANUAL,
            'httpProxy' : self.port_ff_net,
            'ftpProxy'  : self.port_ff_net,
            'sslProxy'  : self.port_ff_net,
            'socksProxy': self.port_ff_net,
            'noProxy'   : ''
        })
        self.profile = webdriver.FirefoxProfile()
        self.profile.set_preference("network.proxy.type" , 1)
        self.profile.set_preference("network.proxy.http" , "localhost")
        self.profile.set_preference("network.proxy.http_port" , self.bmp_port.port)
        self.profile.set_proxy(self.proxy_my_ff)
 
    def start_firefox_url(self,site_url): #site_url адрес нужного сайта
        """метод вызова браузера с заданными  настройками прокси в
        методе  __init__ и переход на заданный адрес сайта"""
        try:
            self.url = site_url
            self.driver = webdriver.Firefox(self.profile)
            self.driver.get(self.url)
            sys.stdout.write('Открылся порт = ' + str(self.bmp_port.port) + '\n' + 'порт выхода в сеть = ' + str(self.resp.json()['port']) + '\n' )
        except WebDriverException as err:
            print('отработало исключение в методе start_firefox_url')
            self.bmp_stop()
            print('объект уничтожен')
 
    def bmp_stop(self):
        """метод отстановки browsermobproxy но порты почему то заняты остаются ((("""
        self.bmpproxy.stop()
 
 
#======================================================================================
class BMP_FF_getRequests(BMP_FF):
    """
    данный  класс будет уметь обрабатывать Get request
    """
    pass
    
#=====================================================================================
class Working_coockies(Config_firefox_start):
    """
    Этот класс является потомком класса Working_coockies
    класс работает с куками, но проблема в перехвате GET запросов
    для перехвата страницы, которая нужна для парсинга ссылки на 
    страницу авторизации. Для перехвата GET запросов нужно попробовать 
    использовать библиотеку BrowserMob Proxy и тогда схема коннекта 
    скрипта ffstart.py будет выглядеть следующим образом - класс Config_firefox_start()
    будет конектится к прокси BrowserMob Proxy а BrowserMob Prox к Burpsuite для визуального
    отображения процесса. При установке Browsermobproxy импортировать сертификаты ssl в браузер который будет использоваться классом Working_coockies()
    """
    def site_cookie(self):
        try:
            self.cookie = {"name": "key","value":"value" , "path" : "/"}
            self.driver.add_cookie(self.cookie)
            self.all_cookies = self.driver.get_cookies()
            print(self.all_cookies)
        except:
            print('что пошло не так в классе Working_cookies()')
 
 
#===================================================================================
 
 
if __name__ == '__main__':
   
        A = BMP_FF()
        A.start_firefox_url('http://www.google.ru')
        A.bmp_stop()
 
        B = BMP_FF()
        B.start_firefox_url('http://www.vk.com')
        B.bmp_stop()

или

--2--

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
if __name__ == '__main__':
    try:
        A = BMP_FF()
    except WebDriverException as err:
       print ('отработало исключение при создании экземпляра объекта BMP_FF()')
       
    try:
        A.start_firefox_url('http://www.google.ru')
    except WebDriverException as err:
        print ('отработало исключение при вызове метода object.start_firefox_url()')
 
    finally:   
        A.bmp_stop()
        print('объект А уничтожен')
    try:
        B = BMP_FF()
    except WebDriverException as err:
        print('отработало исключение при создании объекта экземпляра BMP_FF')
        
    try:
        B.start_firefox_url('http://www.vk.com')
    except WebDriverException as e:
        print('отработало исключение при вызове метода object.start_firefox_url')
    finally:
        B.bmp_stop()
        print('объект В уничтожен')
В первом варианте исключения отрабатывает экземпляр класса автоматом и не надо дополнительно прописывать try/except в блоке :
Python
1
 if __name__ == '__main__':
во втором варианте try/except уже дописываю ручками для каждого экземпляра , что мне кажется не кашерно . По мне больше нравится первый вариант обработки исключений внутри класса. А как Вы бы поступили , какой вариант бы выбрали?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
09.08.2017, 15:39
Лучший ответ Сообщение было отмечено Orakul как решение

Решение

Цитата Сообщение от Orakul Посмотреть сообщение
один в классе BMP_FF() , другой вариант за классом
Не так выбираете.
try ... except нужно ставить только там и исключительно там, где
1) ожидается наличие исключения(причем определенного типа и тип нужно знать), которое вы как разработчик
2) не можете предотвратить ну прям совсем никак (отключился интернет, нет response от сервера, отсутствует файл для чтения и т.д. )и
3) заворачивать в него исключительно ту строчку\строчки которые и могут вызвать это исключение.
И не пихать в один блок перехвата сразу до кучи все прочее.
Иначе получится так, что одна строчка может вызвать одно исключение, другая другое, а перехватываем мы вообще третье (либо вообще не имеющее отношение к данному блоку - KeyboardInterrupt или SystemExit, почитайте про классы исключений).
Блок try except без указания типа исключения - вот это действительно некошерно. Как минимум, если вы не уверены в названии типа нужного исключения, указывайте хотя бы общий класс исключения 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
try:
    f = open('qer4t4t')
# перехватываем все исключения, входящие в класс OSError, в том числе ошибки открытия файлов 
except OSError as err:
    print(err)
    sys.exit(int(err.errno)) # завершаем приложение если не указываем дальнейшую логику 
else:
    print(f.read())
    f.close()
 
 
try:
    f = open('qer4t4t')
# перехватываем только исключение отсутствия файла - FileNotFoundError
except FileNotFoundError as err:
    print(err)
    sys.exit(int(err.errno)) # завершаем приложение если не указываем дальнейшую логику 
else:
    print(f.read())
    f.close()
 
 
try:
    f = open('qer4t4t')
    print(f.read())
# перехватываем все подряд (вот такие мы умные :-)), но хорошо что хоть не KeyboardInterrupt или SystemExit
except Exception as err:
    print(err)
    sys.exit(int(err.errno))  
finally:
    f.close()
В последнем случае можно в try except завернуть и более обширный блок, который может вызвать разнотипные исключения. Однако, тогда вы лишаетесь возможности обработать ошибку индивидуально и указать скрипту должную логику работы после исключения.
А просто выводить в stdout сообщение об ошибке и ничего не делать - некошерно вдвойне.
Либо закрывайте приложение (а как оно будет работать если вы просто в stdout сольете "чувак, все плохо" - если данные не были получены корректно; оно все равно упадет там, где эти данные понадобятся коду), либо дайте скрипту новую логику работу. Это и называется обработкой исключений.

Добавлено через 13 минут
P.S.Обработка исключений в Python
И с блоком else в try except нужно быть осторожным: употреблять только если понимаете зачем он нужен.
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
09.08.2017, 16:56  [ТС]
Garry Galler Благодарю за столь развернутый ответ,узнал больше чем ожидал , а конкретно про sys.exit(int(err.erno)).А то я думаю почему после остановки объекта browsermobproxy - "self.bmp_stop()" - порты остаются занянятыми.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.08.2017, 16:56
Помогаю со студенческими работами здесь

Как узнать имя внедренного объекта?
Внедряю в документ Word объект VBA следующим кодом: ActiveDocument.ToggleFormsDesign Selection.InlineShapes.AddOLEControl...

Как узнать имя конструктора объекта
Всем доброго времени суток. Продолжаю разбираться с ООП в JS. Возникла проблема: хочу написать метод в базовом классе, который будет...

Как узнать имя экземпляра объекта?
Как изнутри экземпляра объекта узнать имя этого экземпляра, например: function someObject () { this.getName () { ...

Как узнать имя UI объекта нажав по нему?
Каким образом можно узнать (допустим) имя UI объекта(картины(лука, который в фотке, ниже)) нажав по нему? Из интернета ничего не помогло. ...

Как узнать имя объекта, используемого в другом классе
Есть вин приложение, соответственно в program.cs создается объект: Application.Run(new Form1()); Хочу использовать этот объект в другом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru