并不是说具有突破性的重要性或任何东西,但我通常会看到人们提到将一个异常从一个方法转发给调用者,因为抛出"up",从技术上讲,它在调用堆栈中向下抛出,对吧?这只是一些程序员的幽默还是什么?或者是否设想调用堆栈正在增长?
在将一个String月转换为整数时,我试图抛出自己的NumberFormatException.不知道如何抛出异常.任何帮助,将不胜感激.我是否需要在此部分代码之前添加try-catch?我的代码中已有一个代码.
// sets the month as a string
mm = date.substring(0, (date.indexOf("/")));
// sets the day as a string
dd = date.substring((date.indexOf("/")) + 1, (date.lastIndexOf("/")));
// sets the year as a string
yyyy= date.substring((date.lastIndexOf("/"))+1, (date.length()));
// converts the month to an integer
intmm = Integer.parseInt(mm);
/*throw new NumberFormatException("The month entered, " + mm+ is invalid.");*/
// converts the day to an integer
intdd = Integer.parseInt(dd);
/* throw new NumberFormatException("The day entered, " + dd + " is invalid.");*/
// converts …Run Code Online (Sandbox Code Playgroud) catch在Ruby中意味着跳出深层嵌套的代码.在Java中,例如可以用Java try-catch来处理异常,但它被认为是不好的解决方案,而且效率也非常低.在Ruby中我们处理异常begin-raise-rescue,我认为将它用于其他任务也很昂贵.
Ruby是否catch-throw真的是一个更有效的解决方案,begin-raise-rescue还是有任何其他理由使用它来打破嵌套块而不是begin-raise-rescue?
在C++ 11中,这是不推荐使用的:
void foo() throw();
Run Code Online (Sandbox Code Playgroud)
并替换为
void foo() noexcept;
Run Code Online (Sandbox Code Playgroud)
在本文中,我们解释了其中的原因(其中包括归结为同样的事情)
在运行时而不是在编译时检查C++异常规范,因此它们不提供程序员保证已处理所有异常.
虽然这对我有意义,但我不明白为什么throw()首先动态检查,或者为什么noexcept除了调用std::terminate而不是正常的堆栈展开之外不提供异常保证(这实际上不是IMO的坚实保证).
如果发生这种情况,是否有可能在编译期间检查是否抛出异常并且编译失败?我认为,基本上有三种情况:
void foo() noexcept
{
// 1. Trivial case
throw myexcept();
// 2. Try-catch case
// Necessary to check whether myexcept is derived
// from exception
try
{
throw myexcept();
}
catch(exception const & e)
{}
// 3. Nested function call
// Recursion necessary
bar();
}
Run Code Online (Sandbox Code Playgroud)
使用C++中的模板为每种类型实例化,编译应用程序仍然需要永远 - 所以为什么不改变noexcept以强制编译器检查在编译期间是否抛出异常?
我看到的唯一困难是函数可能会或可能不会根据运行时状态抛出 - 但noexcept在我看来,不应该允许该函数调用自身. …
我是Java新手,在抛出异常方面遇到了一些问题.也就是说,为什么这是不正确的
public static void divide(double x, double y){
if(y == 0){
throw new Exception("Cannot divide by zero.");
//Generates error message that states the exception type is unhanded
}
else
System.out.println(x + " divided by " + y + " is " + x/y);
//other code follows
}
Run Code Online (Sandbox Code Playgroud)
但这样好吗?
public static void divide(double x, double y){
if(y == 0)
throw new ArithmeticException("Cannot divide by zero.");
else
System.out.println(x + " divided by " + y + " is " + x/y);
//other …Run Code Online (Sandbox Code Playgroud) 根据优化C++,
对于您确定永远不会抛出异常的函数,使用空的异常规范(即,对声明追加throw()).
如果我知道90%的方法都不会抛出异常怎么办?将throw()附加到所有这些方法似乎是非常规和冗长的.如果没有,有什么好处?或者我在这里误解了什么?
我正在尝试学习Swift,并想知道苹果对下面实验的预期答案,该实验在苹果公司GuidedTour游乐场的“ 错误处理”部分中提供,如下所示;
实验:添加代码以在do块内引发错误。您需要引发哪种错误,以便第一个catch块可以处理该错误?那第二块和第三块呢?
enum PrinterError: ErrorType {
case OutOfPaper
case NoToner
case OnFire
}
func sendToPrinter(printerName: String) throws -> String {
if printerName == "Never Has Toner" {
throw PrinterError.NoToner
}
return "Job sent"
}
do {
let printerResponse = try sendToPrinter("Gutenberg")
print(printerResponse)
} catch PrinterError.OnFire {
print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
print("Printer error: \(printerError).")
} catch {
print(error)
}
Run Code Online (Sandbox Code Playgroud)
以下是我对本实验中提出的问题的回答,它们似乎都可以起作用...
您需要引发哪种错误,以便第一个catch块可以处理该错误? …
在JavaScript方法中抛出InvalidArgumentException,就像在Java或类似语言中一样.
我一直在努力熟悉JavaSctipt错误处理,我知道我可以使用throw关键字抛出异常.
为此,我还阅读了MDN上的throw文档和MDN上的Error文档.
到目前为止这是我的代码:
if (mySize >= myArray.length)
throw new Error("InvalidArgumentExcpetion - BANG!!!!");
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说有些问题:
所以现在我很困惑.
我正在阅读《面向Web开发人员的专业Javascript》一书,并看到了以下代码。我对此有一些疑问:
function matchesSelector(element, selector){
if(element.matchesSelector){
return element.matchesSelector(selector);
}else if(element.msMatchesSelector){
return element.msMatchesSelector(selector);
}else if(element.mozMatchesSelector){
return element.mozMatchesSelector(selector);
}else if(element.webkitMatchesSelector){
return element.webkitMatchesSelector(selector);
}else{
throw new Error("Not supported!");
}
}
if(matchesSelector(document.body, "body.page1")){
//do somthing
}
Run Code Online (Sandbox Code Playgroud) 我正在使用遗留库的项目上工作,该遗留库使用函数定义如
void func() throw(some_exception);
Run Code Online (Sandbox Code Playgroud)
由于动态异常规范在C ++ 17中已删除,所以我想知道如何解决此问题。
P0003R0建议更换
void func() throw(some_exception)
{
/* body */
}
Run Code Online (Sandbox Code Playgroud)
用类似的东西
void func()
{
try
{
/* body */
}
catch(const some_exception&) {
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我无权访问源代码(仅头文件)。
因此,我只能尝试“修复”标头中的函数定义。所以例如我可以写
void func() noexcept(false);
Run Code Online (Sandbox Code Playgroud)
但是,当函数引发异常时,我的应用程序仍会终止。
如何更改头文件中的函数定义或可能调整我自己的项目(我使用的地方func)以获得与throw(some_exception)C ++ 17之前相同的行为?