“Try...Catch”块不与 parseInt() 一起使用

Posted

技术标签:

【中文标题】“Try...Catch”块不与 parseInt() 一起使用【英文标题】:"Try...Catch" Block not Working with parseInt() 【发布时间】:2015-02-01 19:07:23 【问题描述】:

我想做的事:

我有一个 javascript 程序,当单击按钮时,它会从表单中的 4 个文本框中获取 4 个字符串,并将这些字符串输出到格式化的文本区域中。

function testResults(form)
var errorhandle1 = parseInt(document.myForm.Item_Code.value);
var errorhandle2 = parseInt(document.myForm.Item_Cost.value);
var errorhandle3 = parseInt(document.myForm.Quantity.value);
//above variables are for error handling.
var d = "   ";
var subtotal = parseInt(form.Item_Cost.value) * parseInt(form.Quantity.value);
var subtotalValue = parseInt(document.myForm.Subtotal.value);
var testVar = "Item Code: " + form.Item_Code.value + d + 
              "Item Name: " + form.Item_Name.value + d + 
              "Item Cost: " + form.Item_Cost.value + d + 
              "Quantity: " + form.Quantity.value + '\n';


document.myForm.myTextarea.value += testVar;
document.myForm.Subtotal.value = parseInt(subtotal) + subtotalValue;
document.myForm.Sales_Tax.value =  document.myForm.Subtotal.value * salestax;
document.myForm.Total.value = parseInt(document.myForm.Subtotal.value) + parseFloat(document.myForm.Sales_Tax.value);

上面的代码工作得很好,并且在我的程序范围内完全符合我的要求。

try 
    if ((isNaN(errorhandle3) == true) || (isNaN(errorhandle2) == true)) 
        throw "Error1";
    
 catch (e) 
    if (e == "Error1") 
        alert("Error! You must enter a number into the qty and cost fields!");
    

我试图用 try...catch 块完成的只是为了确保

document.myForm.Item_Code.value
document.myForm.Item_Cost.value
document.myForm.Quantity.value

实际上是数字。

try...catch 语句在我每次运行程序时触发,并不关心我在相应的文本框中输入了什么。我将非常感谢对此的任何和所有见解!

另外:我查看了这两个链接,但无法理解我的问题。 javascript parseInt return NaN for empty string http://www.w3schools.com/jsref/jsref_isnan.asp

【问题讨论】:

在这里使用try/catch 来解决这个本身不会抛出的简单问题是没有意义的。您可以直接使用if 语句,代码会更简单且性能更好。我认为这里不需要例外。 提示:不要针对 == true 测试布尔值。这是多余的; if (isNaN(errorhandle3) || isNaN(errorhandle2)) 读起来更好。 感谢两位的快速回复。我现在正在改变这些。 【参考方案1】:

您的根本问题是isNaN() 测试该值是否为NaN。它不会测试字符串是否是正确的数字。它有一些强制规则来尝试处理字符串,但这确实不是它的设计目的。

您可以在此处查看测试是否可以将某些内容解析为有效数字的方法:Validate decimal numbers in JavaScript - IsNumeric()

值得阅读那里的好答案中的详细信息,但归结为这样的内容比您需要的要多一些,但是是通用的:

function isNumber(n) 
  return !isNaN(parseFloat(n)) && isFinite(n);

而且,没有理由在你的代码中使用异常,所以你可以这样做:

if (!isNumber(errorhandle3) || !(isNumber(errorhandle2)) 
   alert("Error! You must enter a number into the qty and cost fields!");


另外,在您的代码中,一些 .Value 属性看起来可能应该是 .value(小写)。

【讨论】:

我认为这是我的问题,现在尝试一下。 @Fishbones - 也可能.Value 应该是.value 但是,您实际上不能将无穷大数字“输入”到表单字段中:D @LeoDeng - 是的,我知道 - 这是一个通用的函数,在这里也可以使用。 在此之前他使用parseInt,它返回一个正确的数字,或者NaN。所以检查isNaN就足够了。【参考方案2】:

在您的第一个代码块中

var errorhandle2 = parseInt(document.myForm.Item_Cost.Value);
var errorhandle3 = parseInt(document.myForm.Quantity.Value);

您使用的是Value,应该是value,区分大小写。

顺便说一句,isNaN 返回布尔值,你不必和true 比较

【讨论】:

以上是关于“Try...Catch”块不与 parseInt() 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

2019-12-2 异常捕获

异常 try catch finally throw throws

Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

try/catch 和 MFC TRY/CATCH 有啥区别?

求try catch语法

在java语言中try-catch的catch中能否再加try--catch?