产生错误和调试修正错误是程序员工作的一部分

676 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

正要开一个派对,突然发现零食吃光了,所以你让朋友帮忙去买点零食。

javascript_error_001.jpeg

嘿,你能不能去商店买点零食,好吗?
然后她说
要买什么样的零食?
然后你接着回答 你知道的,薯片之类的。我们这里现在没有零食了。
她说
你想让我买几袋薯片?
然后你就开始觉得好笑了。
随便,大概5袋吧。
什么样的薯片
你看着买吧,
然后说 "啊,算了吧,我还是详细地说一说吧",
然后就具体解释要买什么样,以及需要买多少薯片。
"去买 5 袋中等大小的培根味的薯片"。
10 分钟后,她空手而归,说 "他们没有中等大小的薯片袋 "。

大多数人对"从事软件相关的人"有一些刻板印象,因为他们在做事总是要求精确,甚至到了有点荒唐的地步。

javascript_error_002.jpeg

当然,现实要比这更复杂。没有两种类型的人,人性格也就是类型千差万别。而对于某些人来说,计算机编程更适合他们,因为计算机是绝对精确和令人难以置信的明确。但这并不意味着,如果你不认为自己是一个"数学人",你就不会成为一个好的开发者,这个并非绝对。只要积极认识和理解计算机的工作方式,这样能够成为很好计算机从业者。

javascript_error_003.jpeg

SyntaxError

console,log("hello world")

计算机的这种行为会导致许多错误。如果你输入 "console 逗号 log" 而不是 "console 点 log",JavaScript会说 "我不知道你是什么意思"。你会犯错,你的程序会有错误,这就是生活。每个程序员都会犯错,这并不重要,重要的是你如何处理错误。处理错误是基本技能。这使得编程与大多数其他工作不同:错误是可以保证的,你不能完全避免这样错误,而处理错误是你工作的一部分。

这里我们有一个函数定义,在最后,有一个括号。这个括号不应该出现在那里,破坏了程序,所以 JavaScript 提示:"SyntaxError: Unexpected token )"。) 那个括号是意外的。

const cube = (num) => {return num * num * num})

这里我们有一个函数定义,在最后,有一个括号。不应该出现在那里,破坏了程序,所以JavaScript说:"SyntaxError: 未预期的标记)"。) 那个括号是意外的。

ReferenceError

SyntaxError 语法错误就像在胡言乱语。没有人理解。下一种错误与语法类似,但不是破坏语言的语法规律,而是破坏你自己代码的语法规律。

const abs = (num) => {
    if(num > 0){
        return num;
    }else if(num < 0 ){
        return -num;
    }else{
        return 0;
    }
}

创建了 abs的函数,这个函数返回一个数字的绝对值。如果你调用ads而不是abs,JavaScript 解释器会抱怨。ReferenceError: ads is not defined。因为误输入,结果是调用一个其实并不存在的函数。

ads(12)
^

ReferenceError: ads is not defined
    at Object.<anonymous> (/Users/jangwoo/Desktop/Zi/js_conf/errors-in-javascript/index.js:11:1)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3

之后的这么多行,可能看起来满吓人的,但实际上是为了帮助你。这是一个堆栈跟踪,导致错误的函数调用序列。当你运行你的程序时,即使是很小的程序,实际上并不是那么简单,也会在调用前进行许多工作,你写的代码只是其中一小部分而已—一个复杂的JavaScript系统。

程序的复杂系统,这些程序的运行使你的程序具有生命力。所以,在这里你可以看到,问题出在我的文件里,下一行是我的代码被调用的地方,第三行是第二个地方被调用的地方,我们还可以再深入一些。这就像向后追踪脚步声一样--有一个问题,但我们可以一步步往回走,看看我们是否能找到原因。

console.log(10 *pi)

我们假设这整个底层系统工作正常,所以问题出在我们的代码中。

当你的一个函数调用另一个函数时,你会在堆栈跟踪中看到这个调用序列。堆栈跟踪。

ReferenceError 也可能发生在其他常数上:例如,如果你的代码中有10 * pi。但pi并不存在 - 你没有事先用这个的名字pi 来创建这个常量。那么你会得到一个 ReferenceError。ReferenceError 就像叫错人的名字。

Type Error

下一种错误是当你把一件事与另一件事混淆时。看看这段代码。

let length = 12;
length(3)

首先,我们创建了一个常量 length。这就像给某个东西起一个名字,在这个例子中 给一个数字 12 起一个名字 length,也可以理解 length 容器里装了 12 这个数字。然后在第二行,我们调用一个函数 length并传递一个参数 3。但是等等! length 其实不是一个函数而是一个数字! ,数字不是函数,而这正是JavaScript会抱怨的地方。这是一个类型错误--你所使用的东西的类型是错误的。JavaScript解释器不会告诉你这个东西是什么,但会告诉你他不是什么东西,也就是length不是一个函数。

类型错误就像让你的猫去洗衣服。你可能想问你的室友。所有这些错误--语法(Syntax)、引用(Reference)和类型(Type)错误--都是关于错误的词语。而且所有这些都是明确的--你会看到错误信息,而且会很清楚为什么提示这样错误。

  1. Syntax Error,对于这种错误一些措施是替换、删除或添加符号。通常问题出在括号和引号上:未闭合的括号或者未闭合的引号,括号或者引用应该是封闭的。
  2. Reference Error,检查你所引用的东西是否存在。也许你用错了变量名,也许你忘记了创建这个变量。
  3. Type Error,确保使用的东西是正确。通常问题是一个简单的混淆:你创建了一个数字常数和一个函数常数。但随后试图调用数字。你可能是想调用函数。

Log Error

我们今天要谈的最后一种类型的错误是最糟糕的,就是逻辑错误。例如,我们正在编写一个将华氏温度转换为摄氏温度的函数。要将华氏温度转换为摄氏温度 摄氏度,要减去32,再乘以5/9。比如说。(50°F - 32) x 5/9 = 10°C。

看起来不错,对吗?让我们运行它,转换50度并打印出来。

const fahrToCelsius = (fahr) => {
    return fahr + 32 * 5/9
}

运行程序,得到32.222222222222,而不是 10,这是为什么?JavaScript 没有提出异议,运行这段代码时没有错误。计算机不知道我们在做什么,所以只是按照我们的要求进行计算。但是计算结果是错误的,这里出现以逻辑错误。需要先减去 32,然后再乘以 5/9,但是因为没有加括号,所以是 32 先乘以5/9,然后华氏温度减去得到结果。

打击逻辑错误是程序员 100% 的责任,这有时是很难的,但希望最后会有很大的安慰和满足感。