函数的多个“endings”返回一个对象,返回一个字符串,引发一个异常?

2024-09-28 23:03:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这是个结构设计问题。回来寻求建议。在

首先,我在写一个模块。因此,尽可能让潜在的开发人员使用它。在

在一个对象内(我们称之为Swoosh)我有一个方法,当被调用时,它可能会导致成功(返回一个新对象——为了深入了解:它是一个httplib.HTTPResponse)或失败(令人惊讶,不是吗?)。在

我很难决定如何处理失败。这里主要有两种情况:

  1. 用户提供的数据不正确
  2. 数据还可以,但是需要用户交互()-我需要向用户传递一个字符串,他或她将需要以某种方式使用它。在

在(1)中,我决定用适当的描述raise ValueError()。 在(2)中,因为我需要将str返回给用户。。我不确定是否最好只return一个字符串,让用户检查函数返回了什么(httplib.HTTPResponse或{})或{}自定义异常?通过引发异常传递数据是个好主意吗?我想我在任何地方都没见过这样的事情,但另一方面,我也没见过多少。在

作为开发人员,您对这样的对象/函数有什么期望?在

或者你觉得整个设计很可笑-让我知道,我很乐意学习。在


Tags: 模块数据对象方法函数字符串用户开发人员
3条回答

尽管我很喜欢用特定类型的异常处理这两种情况,但我将提供一种不同的方法,以防有帮助:回调。在

如果您已经使用了Twisted这样的异步框架,那么回调的效果会更好,但这并不是它们唯一的地方。因此,您可能有一个方法,为每个结果取一个函数,如下所示:

def do_request(on_success, on_interaction_needed, on_failure):
    """
    Submits the swoosh request, and awaits a response.

    If no user interaction is needed, calls on_success with a
    httplib.HTTPResponse object.

    If user interaction is needed, on_interaction_needed is
    called with a single string parameter.

    If the request failed, a ValueError is passed to on_failure
    """
    response = sumbit_request()
    if response.is_fine():
        on_success(response)
    elif response.is_partial()
        on_interaction_needed(response.message)
    else:
        on_failure(ValueError(response.message))

作为Python,有很多方法可以做到这一点。您可能不喜欢将异常传递给函数,所以您可能只需要对用户输入场景进行回调。另外,您可以将回调传递给Swoosh初始化器。在

但这也有缺点,例如:

  • 粗心可能会导致通心粉代码
  • 允许调用者向函数注入逻辑(例如,在回调中引发的异常将从Swoosh传播出去)
  • 我这里的例子很简单,你的实际函数可能不是

像往常一样,仔细考虑和良好的文档应该避免这些问题。理论上。在

如果用户交互情况意味着调用代码必须显示一个提示,获取一些输入,然后他们将控制权传递回您的函数,那么尝试用异常处理这个问题可能会很难看。例如

try:
    Swoosh.method()
except UserInteraction, ex:
    # do some user interaction stuff
    # pass it back to Swoosh.method()?
    # did Swoosh need to save some state from the last call?
except ValueError:
    pass # whatever

如果这种用户交互是控制流的一个正常部分,那么首先将用户交互函数传递到您的方法中可能会更简洁—然后它可以将结果返回到Swoosh代码。例如:

^{pr2}$

我认为在这种情况下提出一个例外可能是个不错的主意。在Python中,由于duck类型的原因,将多个信号压缩为一个函数的单个返回值并不理想。它不是很像Python;每次你需要做的事情是:

result = some_function(...)
if isinstance(result, TypeA):
    do_something(result)
elif isinstance(result, TypeB):
    do_something_else(result)

你应该考虑它是否真的是最好的设计。在

在这种情况下,如果实现了一个自定义异常,那么调用函数的代码就可以将返回值视为HTTPResponse。如果函数无法返回其调用者可以以这种方式处理的任何路径,都将通过引发异常来处理。在

同样,捕捉异常并用消息提示用户的代码不必担心它得到的东西的确切类型。它只知道它被显式地(由异常指示)向用户显示某些内容。在

相关问题 更多 >