什么是在Python中引发错误的非常优雅的方法

时间:2016-01-11 01:22:26

标签: python exception error-handling raise raiserror

我目前正在编写银行应用程序,下面你可以看到我的代码:

from customer import Customer
from exceptions import KeyError

class Bank(object):
    """ All the bank operations are contained in this class e.g customer Registration """

    def __init__(self, name):
        self.name = str(name)
        self.customers = dict()
        self.registration_customer(name)

    def registration_customer(self, name):
        """ Registration of a new user to the bank
        Args:
            name (str): name of the customer
        """
        name = str(name)
        if not self.customers.get(name, None):
            self.customers[name] = Customer(name)

    def close_customer_account(self, name, account_type):
        """ close an account of a customer by name and account_type
        Args:
            name (str) : name of the account holder
            account_type (str) : type of account
        """
        name = str(name)
        account_type = str(account_type)
        customer = self.customers.get(name, None)
        if customer:
            customer.close_account(account_type)

    def get_customer_info(self, name):
        """ get customer info
        Args:
            name (str) : name of the customer
        """

        if not self.customers[name]:
            raise KeyError('I am sorry! Customer does not exist')

        return self.customers[name]

提出错误

如果您看到get_customer_info功能,如果name不存在,那么我正在筹集error。假设银行应用程序超级关键,这是我在Python中提出error的最好方法吗?您还可以假设这是生产级代码。

 def get_customer_info(self, name):
        """ get customer info
        Args:
            name (str) : name of the customer
        """

        if not self.customers[name]:
            raise KeyError('I am sorry! Customer does not exist')

        return self.customers[name]

2 个答案:

答案 0 :(得分:1)

我认为这取决于软件的需求。 理想情况下,在提交表单之前,应通知用户他们的输入无效,显示提交按钮并提示输入用户名。

如果提交,则应记录错误,以便生成统计信息,如果这是一个非常关键或异常的错误,则应自动生成电子邮件并发送给相关人员。

应该将用户重定向回输入表单,其中之前提交的信息仍然完整,不要强迫用户重新提交整个表单。

答案 1 :(得分:0)

假设类dict尚未重新定义。第7行,

    if not self.customers[name]:
如果名称没有出现在dict中,

将引发KeyError。这意味着您的代码永远不会到达第8行。

    raise KeyError('I am sorry! Customer does not exist')

解决方案:我会先发现错误。然后自定义错误输出。

    try:
        return self.customers[name]
    except KeyError:
        raise KeyError('I am sorry! Customer does not exist')

我更喜欢的另一种方法是写入stderr。

    from __future__ import print_function
    import sys
    ...
        def error(self, *objs):
            print("[ERROR]:",*objs,file=sys.stderr)

        def get_info(self,name):
            try:
                return self.customer[name]
            except KeyError:
                self.error("CUSTOMER NAME NOT FOUND: %s"%(name))

我更喜欢替代方法,因为您可能不想处理调用代码中的异常。