最近在对Ren'Py游戏机器汉化的时候,收获了对异常的更深的理解,之前的理解在前一篇文中,这里只说新的理解
当我们用一个翻译接口去翻译一个文本的时候,大多数句子是可以翻译的,i have a apple.
但是某些句子可能很奇怪,如,(lucy) can't say [lamer] ,这些夹杂着复杂符号(可能是从程序中产生),总之,文本中就出现了这些奇怪的句子,加入这个奇怪的句子在第50句。
我们从第一句开始翻译,然后翻译到第50局,然后崩溃,控制台显示一大串error,然后我们的翻译终止了。
我们有三个选择,直接去文件里,把那句话修改一下;或者加一个if判断过滤一下;或者增加try语句,捕获异常。
我的理解是这样,去文件里修改,是最不好的,因为这样会破坏原文件,且,如果需要修改的地方太多,就很难操作。
加一个判断挺好的,但是最好判断那些 经常发生的错误。 假如在一个待翻译文本中,挺多句子都存在同样的格式问题,我们加上if,过滤分批处理就好了。
但是如果只有少数部分出错,我们只需要把它认定为异常,然后单独处理,这样就会很方便。
事实上,能用if来实现try的功能,但是我们有时候为了逻辑清晰,可能需要使用try。
而且,在代码块 的 运行频率上来说,把相对很少发生的情况使用异常捕获,比使用if更快。
我们在开车
if (提前知道堵车){
我们绕道
}
else{
我们按照预定的路开车
}
try{
我们开车
}
catch 发生地震{
我们赶紧别开车了,赶紧跑路,保证安全
}
这个例子中,开车的时候,堵车这个情况的发生频率还行,我们加上if而不是使用try。
但是我们开车的时候,发生地震的概率要低得多,所以我们要使用try,而不是if。
为什么呢?因为if-else总是需要判断,对于 堵车 这件频繁的事件来说,我们 只需要 判断一下就能避免堵车。
但是对于 地震 / 火山喷发 / 冰雹 / 这种很低概率的事情,我们不用每次开车的时候都想着这件事,我们不用每天出门的时候都去官网查一下地球最近的情况。
一个 if-else 重复判断,耗费少量时间,但是对于 两个五五开的分支的时候,非常有效。
一个try-catch 不需要重复判断,节省了 相对于if-else的判断时间,但是一旦 发生了异常(如地震),就需要花费更多的精力 来处理 catch中的语句。
所以,我们使用if-else 还是 try-catch 只要是衡量 分支的频率来决定的,二者相差不大都用if - else;当两个分支的相差概率很大的时候,采用try-catch。
而且,异常捕获,异常处理,这个”异常“二字,就是在 提醒,我们的程序很少碰到的情况,这是使用异常是非常合理的。如果我们的程序经常碰到某些情况,那就不叫”异常“。
使用 For loop,加具体处理时间来进一步解释。
网友评论