2016-05-26 2 views
0

Я работаю над библиотекой для взаимодействия с API. Позже я буду использовать его для создания некоторых инструментов.Где обращаться с исключениями - в библиотечном или пользовательском коде

Теперь мне интересно, где «действительно» обрабатывать исключения.

  1. Если библиотека обрабатывает исключение и возвращать только для кодов примеров ошибок, как «{„ошибка“:„URL не найден“}»
  2. Пропустите исключение кода пользователя, и пусть он будет обрабатываться здесь

Ниже несколько примеров, которые я придумал б/у до сих пор

Пример

import urllib2 

class Request: 
    def send(self, url): 
     try: 
      req = urllib2.Request(url) 
      request = urllib2.urlopen(req) 
      response = request.read() 
      return response 
     except urllib2.URLError as ue: 
      return 'URL not found' 

request = Request() 
print request.send('https://not-a-real-url-.com') 

Печатный Исключение URL не найден

Но я мог бы также вернуть URLError

<urlopen error [Errno 8] nodename nor servname provided, or not known> 

Или поднять ошибку, чтобы код пользователя ручка

try: 
    print request.send('https://not-a-real-url-.com') 
except urllib2.URLError as ue: 
    print 'error' 

Поскольку я m, создавая Библиотеку и Кодекс, я могу обращаться с ней, как я думаю, лучше, но если я хочу поделиться библиотекой, я хочу получить лучшее исключение ошибки, поэтому пользователь не сталкивается с огромными проблемами и требует отладки.

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

Спасибо вам за ввод! Майкл

+0

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

+0

@ HassanMehmood хорошая точка для сообщения об ошибке, это то, что я обычно пропустил, чтобы поместить его сюда. Таким образом, вы позволите родительскому коду обрабатывать исключение? Зачем? – the0MIKE

ответ

0

я бы сохранить его на своем конце и добавить исключение одеяло, которое печатает отладочные:

import urllib2 

class Request: 
    def send(self, url): 
     try: 
      req = urllib2.Request(url) 
      request = urllib2.urlopen(req) 
      response = request.read() 
      return response 
     except urllib2.URLError: 
      return 'URL not found' 
     except Exception as e: 
      return 'Error: '+e 

request = Request() 
print request.send('https://not-a-real-url-.com') 
+0

Итак, прикрывайте самые распространенные исключения, с которыми может столкнуться метод, добавьте исключение в одеяло, чтобы покрыть все остальное. Звучит неплохо. Итак, вы предлагаете завершить обработку в Библиотеке и никогда не передавать исключение родительскому коду, правильно? – the0MIKE

+0

Вот как бы я это сделал – WildCard