当前位置:首页 > 文章列表 > Golang > Go问答 > 处理多个错误或是相应处理它们的一般方式

处理多个错误或是相应处理它们的一般方式

来源:stackoverflow 2024-03-02 22:51:25 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《处理多个错误或是相应处理它们的一般方式》,聊聊,我们一起来看看吧!

问题内容

我有这段代码,我不喜欢这种感觉,更不用说 golint 不喜欢它与 error 应该是返回多个项目时的最后一个类型(golint)。解释一下这段代码:

  • 我想让用户决定是否关心返回的任何错误
  • 特别是在此代码中,有时不需要或不需要音频文件,可以忽略它
  • 无论用户在做什么,都可能始终需要视频和输出文件

我愿意以任何方式重构它(无论是分解它、移动东西等等)。go 中是否有更惯用的方式来完成这样的事情?

// download will download the audio and video files to a particular path
func (r *redditvideo) download() (outputvideofilename string, outputaudiofilename string, errvideo error, erraudio error) {
    outputvideofile, errvideo := downloadtemporaryfile(
        r.videourl,
        temporaryvideofileprefix,
    )
    if errvideo == nil {
        outputvideofilename = outputvideofile.name()
    }

    outputaudiofile, erraudio := downloadtemporaryfile(
        r.audiourl,
        temporaryaudiofileprefix,
    )
    if erraudio == nil {
        outputaudiofilename = outputaudiofile.name()
    }

    return outputvideofilename, outputaudiofilename, errvideo, erraudio
}

同样,我发现自己稍后在代码中再次使用了相同的模式:

// SetFiles sets up all of the input files and the output file
func (l *localVideo) SetFiles(inputVideoFilePath string, inputAudioFilePath string, outputVideoFilePath string) (errVideo error, errAudio error, errOutputVideo error) {
	// Set input video file
	l.inputVideoFile, errVideo = os.Open(inputVideoFilePath)
	if errVideo != nil {
		return
	}
	if errVideo = l.inputVideoFile.Close(); errVideo != nil {
		return
	}

	// Set output video file
	l.outputVideoFile, errOutputVideo = os.Create(outputVideoFilePath)
	if errOutputVideo != nil {
		return
	}
	if errOutputVideo = l.outputVideoFile.Close(); errOutputVideo != nil {
		return
	}

	// IMPORTANT! Set input audio file LAST incase it is nil
	l.inputAudioFile, errAudio = os.Open(inputAudioFilePath)
	if errAudio != nil {
		return
	}
	if errAudio = l.inputAudioFile.Close(); errVideo != nil {
		return
	}

	return
}

这次在这段代码中再次出现了一些与上面相同的情况:

  • 我们关心视频和输出的设置,可能关心也可能不关心音频
  • 有多个错误需要由用户来处理

解决方案


您在标准库中可以看到很多特定函数,它们包装了更通用的非导出函数。请参阅下面的注释代码。

// download is a rather generic function
// and probably you can refactor downloadTemporaryFile
// so that even this function is not needed any more.
func (r *RedditVideo) download(prefix, url string) (filename string, error error) {
    outputFile, err := downloadTemporaryFile(
        r.VideoURL,
        prefix,
    )

    if err == nil {
        return "", fmt.Errorf("Error while download: %s", err)
    }

    return outputFile.Name(), nil
}

// DownloadVideo wraps download, handing over the values specific
// to the video download
func (r *RedditVideo) DownloadVideo() (filename string, averror error) {
    return r.download(TemporaryVideoFilePrefix, r.VideoURL)
}

// DownloadAudio wraps download, handing over the values specific
// to the audio download
func (r *RedditVideo) DownloadAudio() (filename string, averror error) {
    return r.download(TemporaryAudioFilePrefix, r.AudioURL)
}

func main() {

    r := RedditVideo{
        VideoURL: os.Args[1],
        AudioURL: os.Args[2],
    }

    var videoerror, audioerror error
    var videofileName, audiofileName string

    if videofileName, videoerror = r.DownloadVideo(); videoerror != nil {
        fmt.Println("Got an error downloading the video")
    }

    if audiofileName, audioerror = r.DownloadAudio(); audioerror != nil {
        fmt.Println("Got an error downloading the audio")
    }

    fmt.Printf("Video:\t%s\nAudio:\t%s", videofileName, audiofileName)
}

这样,返回的错误来自哪个下载就很明显了。

今天关于《处理多个错误或是相应处理它们的一般方式》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

版本声明
本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
在go语言中如何实现类似Unix中`cat`命令的文本流处理?在go语言中如何实现类似Unix中`cat`命令的文本流处理?
上一篇
在go语言中如何实现类似Unix中`cat`命令的文本流处理?
使用Golang在Mac上进行编程的方法和技巧
下一篇
使用Golang在Mac上进行编程的方法和技巧
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    101次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    94次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    112次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    104次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    105次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码