资讯专栏INFORMATION COLUMN

从JavaScript到Python之异常

xcold / 3131人阅读

摘要:但如果忽视异常轻则影响功能运行,重则导致系统崩溃,造成经济损失。异常处理捕获异常捕获关键字与一致,都是使用。语句块表示无论是否发生异常,语句块代码一定会被执行。

不少前端工程师看到这个标题可能会产生质问:

我js用得好好的,能后端能APP,为什么还要学习Python?

至少有下面两个理由:

学习曲线。ES6之后的JavaScript(TypeScript)的在语法上和Python有很多异曲同工的地方,所以学习曲线非常平滑,上手难度很低。

应用场景。JavaScript虽然是web开发的王者,但是其在某些方面还是存在一些问题的。比如Node.js虽然可以写后端,但大多用于CGI层,做接口整合和模板渲染,而Python、Java这类语言已被广泛应用于后端服务编写,同时Python在做机器学习等方面也很有优势。

这篇文章我们通过对比两种语言之间的“异常”来学习Python。

为什么需要对异常进行处理

异常是编写代码时必须考虑的问题,但却并不是一个热门话题,少有文章提到。
尤其在web前端这一块,浏览器的强大容错能力帮工程师解决(隐藏)了大量的异常。
但如果忽视异常轻则影响功能运行,重则导致系统崩溃,造成经济损失。

异常处理 捕获

JavaScript 异常捕获关键字与 Python 一致,都是使用try

// JavaScript
try {
  ...
}
# Python
try:
  ...

但是两者都具有局限性:只能用来捕获同步执行代码的异常。

对于异步代码的异常捕获的情况 JavaScript 处理起来相对复杂,按运行环境就可以分为 Node.js 和 浏览器,按捕获范围又可以分为全部捕获和局部捕获。

// 浏览器全局异常捕获
window.onError = e => {}  
window.addEventListener("", e => {}) 捕获请求错误
// 浏览器Ajax异常捕获
var xhr = new XMLHttpRequest();
xhr.onload = function(e) { 
  if(this.status > 400){
    ...
  }
};
// Node.js 全局异常捕获
process.on("uncaughtException", e => {})
// Node.js 回调方式异常捕获
fs.readFile("/etc/passwd", (err, data) => {
  if (err) {
    ...
  }
});

Python 的情况要简单很多,即使使用异步线程或进程,也可以在函数内部进行捕获,然后其它方式上报。

def _parse_speed(key_name, speed_list):
  try:
    ...

t = threading.Thread(target=_parse_speed, args=(v, speed_list))
t.start()

由于异常捕获情况比较复杂,如无特殊说明,后文讨论仅指使用try关键字的同步异常捕获。

处理

再看看JavaScript几种处理异常方式。

catch。catch 语句块用来处理异常,处理方式也相当粗放,try 语句块内的所有异常都会被捕获。

finally。finally 语句块表示无论是否发生异常,语句块代码一定会被执行。

不少读者可能会以为在catch语句块后执行的代码和finally语句块作用一样,但其实是有区别的!

下面举个例子

fn = () => {
  try {
    throw Error()
  } catch(e) {
    throw Error()
    return 1
  } finally {
    return 2
  }
  return 3
}
fn() // 是2不是3

也就是说 finally 语句块中的代码,不论 try 还是 catch 执行出错都会执行。

Python的异常处理:

except。可以指定需要处理的多个异常类型,可以有多个异常处理逻辑,写法非常灵活。

else。else 语句块可以当 try 语句块未发生异常时执行。

finally。特性同 JavaScript。

下面列举使用 except 的几个例子:

# 捕获异常实例
except Exception as e:

# 批量异常捕获
except (IOError, TypeError):

# 异常分类捕获:
except OSError as err:
  ...
except ValueError:
  ...
except:
  ...
抛出

JavaScript 中可以通过关键字 throw 来抛出一个 Error 对象。
Python中与之对应的是 raise ,用来抛出一个 Exception 实例。

虽然关键字不一样但是写法基本相似:

// JavaScript
throw Error(...)
# Python
raise Exception(...)
异常类型

对于 JavaScript 而言,谈异常类的意义不大,处理不同的异常需要手动判断,所以异常类型也比较简单。

Python的异常类型则丰富得多

总结

捕获方面,JavaScript 的场景要比 Python 复杂,迁移学习 Python 很简单。

处理方面,两者都支持 finally 关键字。不同的是JavaScript 的操作被简化,只能通过一个 catch 语句块来处理所有类型异常。而 Python 的做法和大多数高级语言一致,能多次、针对不同异常进行分别处理,else 关键字算是一个特色功能。

抛出方面,两者只是关键字不同。

参考:

《如何优雅处理前端异常?》

《Python异常捕获与处理》

《Python 异常处理》

Python错误和异常

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106283.html

相关文章

  • 爬虫 + 自动化利器 selenium 自学成才篇(二)

    摘要:耗时代码运行到这句之后触发隐式等待,在轮询检查后仍然没有定位到元素,抛出异常。耗时值得一提的是,对于定位不到元素的时候,从耗时方面隐式等待和强制等待没什么区别。 ...

    AWang 评论0 收藏0
  • 爬虫初级操作(一)

    摘要:一个对应相应的状态码,状态码表示协议所返回的响应的状态。下面将状态码归结如下继续客户端应当继续发送请求。继续处理由扩展的状态码,代表处理将被继续执行。处理方式丢弃该状态码不被的应用程序直接使用,只是作为类型回应的默认解释。 本篇内容为 python 网络爬虫初级操作,内容主要有以下 3 部分: python 关于爬虫的一些基本操作和知识 静态网页抓取 动态网页抓取 基本操作和知识...

    Ocean 评论0 收藏0
  • Python3网络爬虫实战---37、动态渲染页面抓取:Selenium

    摘要:不过动态渲染的页面不止这一种。再有淘宝这种页面,它即使是获取的数据,但是其接口含有很多加密参数,我们难以直接找出其规律,也很难直接分析来抓取。我们用一个实例来感受一下在这里们依然是先打开知乎页面,然后获取提问按钮这个节点,再将其 上一篇文章:Python3网络爬虫实战---36、分析Ajax爬取今日头条街拍美图下一篇文章:Python3网络爬虫实战---38、动态渲染页面抓取:Spla...

    zhjx922 评论0 收藏0
  • Python有什么好学的》上下文管理器

    摘要:引上下文管理器太极生两仪,两仪为阴阳。而最常用的则是,即上下文管理器使用上下文管理器用之后的文件读写会变成我们看到用了之后,代码没有了创建,也没有了释放。实现上下文管理器我们先感性地对进行猜测。现实一个上下文管理器就是这么简单。 Python有什么好学的这句话可不是反问句,而是问句哦。 主要是煎鱼觉得太多的人觉得Python的语法较为简单,写出来的代码只要符合逻辑,不需要太多的学习即可...

    qpwoeiru96 评论0 收藏0
  • Python基础(九)错误和异常

    摘要:另一种常见错误是逻辑错误。当检测到一个错误时,解释器就无法继续执行下去,于是抛出提示信息,即为异常。 错误 >>> for i in range(10) File , line 1 for i in range(10) ^ SyntaxError: invalid syntax 上面那句话因为缺少冒号:,导致解释器无法解释,于是报错。这个...

    yimo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<