当前位置: 首页 > 面试题库 >

处理多个错误

薛华奥
2023-03-14
问题内容

我是新手,发现错误处理非常冗长。我已经读过它的理由并大体上同意,但是似乎在某些地方似乎有更多代码来处理错误而不是实际工作。这是一个(人为的)示例,我在其中传送“
Hello world!”。进入cat并读取并打印输出。基本上,每一行都可以再处理三个错误,而我什至没有处理任何事情。

package main

import "fmt"
import "io"
import "io/ioutil"
import "os/exec"


func main() {
    cmd := exec.Command("cat", "-")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        return
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return
    }
    err = cmd.Start()
    if err != nil {
        return
    }
    _, err = io.WriteString(stdin, "Hello world!")
    if err != nil {
        return
    }
    err = stdin.Close();
    if err != nil {
        return
    }
    output, err := ioutil.ReadAll(stdout)
    if err != nil {
        return
    }
    fmt.Println(string(output))
    return
}

有没有惯用的,干净的方法来处理此问题?我只是觉得我在想什么。


问题答案:

显然,我们必须处理任何错误。我们不能仅仅忽略它们。

例如,为了使示例更不虚假,

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "os/exec"
)

func piping(input string) (string, error) {
    cmd := exec.Command("cat", "-")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        return "", err
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return "", err
    }
    err = cmd.Start()
    if err != nil {
        return "", err
    }
    _, err = io.WriteString(stdin, input)
    if err != nil {
        return "", err
    }
    err = stdin.Close()
    if err != nil {
        return "", err
    }
    all, err := ioutil.ReadAll(stdout)
    output := string(all)
    if err != nil {
        return output, err
    }
    return output, nil
}

func main() {
    in := "Hello world!"
    fmt.Println(in)
    out, err := piping(in)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(out)
}

输出:

Hello world!
Hello world!

错误处理和执行

在Go中,错误处理很重要。该语言的设计和约定鼓励您明确检查错误发生的位置(与其他语言中抛出html" target="_blank">异常并有时捕获它们的约定不同)。在某些情况下,这会使Go代码变得冗长。



 类似资料:
  • 问题内容: 有没有办法清理此(IMO)恐怖代码? 具体来说,我在谈论错误处理。能够一次性处理所有错误将是很好的。 问题答案:

  • 问题内容: 在运行Linux 2.6.35+的系统中,我的程序创建了许多子进程并对其进行监视。如果子进程死了,我会进行一些清理并再次产生该进程。我经常在过程中获取信号。与异步使用。 当将信号处理程序用于非实时信号时,当信号处理程序针对特定信号运行时,必须阻止同一信号的进一步出现,以避免进入递归处理程序。如果此时有多个信号到达,则内核仅调用一次处理程序(当信号被解除阻塞时)。 使用时是否具有相同的行

  • 我正在使用注释在SpringMVC中进行验证。。。 我对一个字段使用了两个注释进行验证 @NotEmpty(message=“required”) @大小(最小值为3,最大值为8,消息为超出范围) 私有字符串密码; 我面临的问题是,当字段留空时,它会显示两条错误消息(*必需,并且超出范围)。但我想显示其中一条错误消息,而不是两条。。。 可以用一条消息进行限制吗?如果是,这种情况的可能性是什么? 任

  • 问题内容: 使用时出现此错误: 没有说明,仅堆栈跟踪到模块内的pool.py文件。 使用这种方式: 我怀疑可挑剔性可能存在问题(python需要将列表数据转换为字节流,或者将列表数据转换为字节流),但是我不确定这是否正确或是否要调试。 编辑:产生此错误的代码的新格式: 产生错误: 问题答案: 在Python 2.x和3.0、3.1和3.2中,对象 不是上下文管理器 。您不能在语句中使用它们。只有在

  • 问题 你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢? 解决方案 如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示: try: client_obj.get_url(url) except (URLError, ValueError, SocketTimeout): client_obj.remove_url(u

  • 我必须在Spring批处理作业中实现以下用例: 通过读取提供程序列表 遍历列表,并为步骤1中找到的每个提供程序(作为输入参数)调用另一个。 第二个SP的输出将写入CSV。 我提出了以下策略: 第1步开始 SP ItemReader返回提供程序列表。 在ItemWriter中,将提供程序保存到 步骤1结束 第2步开始 另一个SP项目读取器从访问提供程序 另一个ItemWriter使用FlatFile