处理错误的正确方法是什么?

时间:2012-02-10 00:05:18

标签: python

我的脚本在下面抓取一个网站并从表中返回数据。它没有完成,但它的工作原理。问题是它没有错误检查。我的脚本应该在哪里进行错误处理?

没有单元测试,我应该写一些并安排我的单元测试定期运行。或者我的脚本中是否应该完成错误处理?

任何关于正确方法的建议都会很棒。

#!/usr/bin/env python
''' Gets the Canadian Monthly Residential Bill Calculations table
    from URL and saves the results to a sqllite database.
'''
import urllib2
from BeautifulSoup import BeautifulSoup


class Bills():
    ''' Canadian Monthly Residential Bill Calculations '''

    URL = "http://www.hydro.mb.ca/regulatory_affairs/energy_rates/electricity/utility_rate_comp.shtml"

    def __init__(self):
        ''' Initialization '''

        self.url = self.URL
        self.data = []
        self.get_monthly_residential_bills(self.url)

    def get_monthly_residential_bills(self, url):
        ''' Gets the Monthly Residential Bill Calculations table from URL '''

        doc = urllib2.urlopen(url)
        soup = BeautifulSoup(doc)
        res_table = soup.table.th.findParents()[1]
        results = res_table.findNextSibling()
        header = self.get_column_names(res_table)
        self.get_data(results)
        self.save(header, self.data)

    def get_data(self, results):
        ''' Extracts data from search result. '''

        rows = results.childGenerator()
        data = []
        for row in rows:
            if row == "\n":
                continue
            for td in row.contents:
                if td == "\n":
                    continue
                data.append(td.text)
            self.data.append(tuple(data))
            data = []

    def get_column_names(self, table):
        ''' Gets table title, subtitle and column names '''

        results = table.findAll('tr')
        title = results[0].text
        subtitle = results[1].text
        cols = results[2].childGenerator()
        column_names = []
        for col in cols:
            if col == "\n":
                continue
            column_names.append(col.text)

        return title, subtitle, column_names

    def save(self, header, data):
        pass

if __name__ == '__main__':
    a = Bills()
    for td in a.data:
        print td

4 个答案:

答案 0 :(得分:2)

查看所有函数的文档,看看它们抛出的所有exceptions

例如,在urllib2.urlopen()中,它写成Raises URLError on errors。它是IOError的子类。

因此,对于urlopen(),您可以执行以下操作:

try:
    doc = urllib2.urlopen(url)
except IOError:
    print >> sys.stderr, 'Error opening URL' 

同样,对其他人也一样。

答案 1 :(得分:1)

您应该编写单元测试,您应该使用异常处理。但只能抓住你能处理的例外;通过捕捉所有内容并丢弃任何有用的信息,你不会给任何人带来任何好处。

但是,不会定期运行单元测试;它们在代码更改之前和之后运行(尽管如果它们足够接近,一个更改的“之后”变为“之前”的另一个更改是可行的。

答案 2 :(得分:0)

一个copple你需要拥有它们。在导入像tkinter这样的东西 尝试:    将Tkinter导入为tk 除了:    将tkinter导入为tk 也可以是用户输入具有n种预期类型的​​东西的任何地方。解决这个问题的一个好方法是运行它abd尝试真的很难让它崩溃。例如输入错误的类型。

答案 3 :(得分:0)

答案“我的脚本中应该在哪里进行错误处理?”基本上是“任何可能出错的地方”,这完全取决于你的程序的逻辑。

一般情况下,如果您的程序依赖于某个特定操作按预期工作的假设,并且可能没有,您应该添加代码以检查它是否确实有效,并且如果没有,则采取适当的补救措施。在某些情况下,底层代码可能会在失败时生成异常,您可能会很乐意让程序以未捕获的异常终止而不添加您自己的任何错误处理代码,但(1)这将是,或者应该是的,如果你以外的任何人都会使用该计划,那就很少见; (2)无论如何,我会说这将属于“按预期工作”类别。