Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
530 views
in Technique[技术] by (71.8m points)

try catch - JSLint error: Expected 'ignore' and instead saw 'ex'

I use JSLint all the time, but just today, I came across an error that I've never seen before. With the following code, I got the error shown below:

try {

  document.execCommand('BackgroundImageCache', false, true);

} catch (ex) {}

Error:

Expected 'ignore' and instead saw 'ex'.
} catch (ex) {}

So I changed my code to the following, and the error went away:

try {

  document.execCommand('BackgroundImageCache', false, true);

} catch (ignore) {}

I can't find any explanation on the Internet regarding why this would fix the error. Does anyone know what's up or why this fixed the problem?

Thank you.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I think you're right -- jslint didn't used to complain like this. Instead, it told you that you needed to do something with ex, right? I'll check github to see and edit this later. EDIT: Great catch [by you]! Crockford, JSLint's author, added this on April 29th of this year around line 3444. And he uses empty catch blocks in jslint's source, so I guess he has to give us the kludge too. ;^)

JSLint wants you to kludge empty catch blocks with ignore as the variable name so that it's obvious to people reading your code that you intentionally meant not to do anything in your catch block. As Crockford says elsewhere, he feels that, "It is difficult to write correct programs while using idioms that are hard to distinguish from obvious errors."

1.) ex used (okay)

So (as I'm guessing you know) if you write this code and do something with ex, jslint doesn't complain.

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ex) {
    window.alert(ex);
}

2.) ex unused means ignore (okay too)

So if you mean not to do anything with ex, he wants the code to tell folks you didn't screw up by leaving your ex equivalent in there by naming that variable ignore.

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ignore) {
}

3.) ignore used (error!)

So, in typical Crockfordian fashion, you now can't use ignore and actually do something in the catch block!

/*jslint browser: true, white:true, sloppy:true*/

var spam;

try {
    spam = "spam";
} catch (ignore) {
    window.alert(ignore);
}

That gives

Unexpected 'ignore'. } catch (ignore) {

Just another hyper-explicit "don't make code that looks like an error" move by Crockford.

(Aside: Might be fun to take a look at Why are empty catch blocks a bad idea while you're on the subject. Honestly, though ignore is probably a useful convention, based on that discussion (I mean, it includes Skeet arguing against empty catch blocks!), I'm a little surprised Crockford allows the ignore kludge, as the above link has arguments that feel a lot like his for calling some regular expressions "unsafe".)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...