标签: throw

投掷我的析构函数时,为什么总是在"抛出一个......的实例后终止"?

我正在尝试编写一个单元测试来检测我的类的lock()功能的无效使用.为了做到这一点,我想使用析构函数并从那里抛出一个异常.不幸的是,g ++决定调用std :: terminate()而不是捕获异常.

该类有一个非常简化的版本:

class A
{
public:
    A() : f_lock(0) {}
    ~A() { if(f_lock) throw my_exception("still locked"); }
    lock() { ++f_lock; }
    unlock() { --f_lock; }
private:
    int f_lock;
};
Run Code Online (Sandbox Code Playgroud)

有一个有效的测试:

A *a = new A;
a->lock();
...
a->unlock();
delete a;
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写无效测试:

A *a = new A;
a->lock();
...
bool success = false;
try
{
    delete a;
}
catch(my_exception const&)
{
    success = true;
}
catch(...)
{
    // anything else is a failure
}
if(!success)
{
    // test …
Run Code Online (Sandbox Code Playgroud)

c++ destructor g++ exception throw

6
推荐指数
1
解决办法
8661
查看次数

在Swift 2中处理异步闭包错误的最佳方法是什么?

我使用了很多异步网络请求的(顺便说一句任何网络请求的iOS需要通过异步),我发现的方式来更好地应对来自苹果的错误,dataTaskWithRequest它并不支持throws.

我有这样的代码:

func sendRequest(someData: MyCustomClass?, completion: (response: NSData?) -> ()) {
    let request = NSURLRequest(URL: NSURL(string: "http://google.com")!)

    if someData == nil {
        // throw my custom error
    }

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        // here I want to handle Apple's error
    }
    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

我需要解析我可能的自定义错误并处理可能的连接错误dataTaskWithRequest.引入了Swift 2 throws,但你不能抛弃Apple的关闭,因为它们没有抛出支持并且运行异步.

我只看到添加到我的完成块NSError返回的方法,但据我所知使用的NSError是旧式的Objective-C方式.ErrorType只能用于投掷(afaik).

使用Apple网络闭包时,处理错误的最佳和最现代的方法是什么?根据我的理解,任何异步网络功能都没有办法投入使用吗?

asynchronous throw nserror swift

6
推荐指数
1
解决办法
3063
查看次数

“抛出新异常”和“新异常”之间的区别?

我有兴趣了解使用throw new Exception()和 的最佳实践new Exception()。在使用的情况下new Exception(),我已经看到代码移动到下一个语句而不是抛出异常。

但是我被告知我们应该使用new Exception()to throw RuntimeException

任何人都可以对此有所了解吗?

java exception throw

6
推荐指数
1
解决办法
4万
查看次数

`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 和有什么区别?

我见过 3 种在 JavaScript 中抛出错误的不同方式:

throw 'message';
throw Error('message');
throw new Error('message');
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别?

注意:我知道类似的问题(123等)。它们都没有涵盖所有三种情况。

javascript error-handling throw

6
推荐指数
1
解决办法
1083
查看次数

Jasmine .and.throwError() 在原始代码中没有被 .catch 捕获

我正在为一个函数编写一个测试,并且必须触发该函数的 .catch 部分,但是 Jasmine 的间谍由于某种原因不能这样做。测试方法:

foo(){
doStuff()
.catch((error) => {
    //stuff I still have to test
    bar()
})
Run Code Online (Sandbox Code Playgroud)

}

doStuff() 返回一个 Promise(因此是 .catch-Setup),但是对于这个测试,它应该抛出一个错误。

这是我的测试:

it('tests the error handling of foo',(done) =>{
spyOn(object,'foo').and.throwError('Test Error');

object.foo();

expect(object.bar).toHaveBeenCalled();
done();
Run Code Online (Sandbox Code Playgroud)

});

我接近这个的方式是错误的吗?这是茉莉花的错误吗?(谷歌没有找到任何东西)[我坚持(完成)设置,因为几乎所有其他测试都是异步的,我想保持这种风格]

[我无法更改要测试的代码]

javascript testing throw jasmine

6
推荐指数
2
解决办法
5491
查看次数

Dart 中有没有办法将函数标记为抛出异常?

我试图在 Flutter/Dart 中找到一种方法来标记一个在执行过程中可能抛出异常的函数。在文档和谷歌中搜索一段时间后,我没有找到任何方法。

在其他语言中,例如 Swift、Java、Kotlin 等,我知道我们有这样的机制。Swift 中的示例代码是:

func doSomething() throws { ... }
Run Code Online (Sandbox Code Playgroud)

有谁知道这在 Dart 中是否存在?我认为它会很有用。

如果由于 Dart 语言设计它不存在,那么也许任何人都可以解释这个决定背后的原因。

提前致谢!

try-catch throw dart flutter

6
推荐指数
1
解决办法
1636
查看次数

NodeJS:抛出错误仍然会带来性能损失吗?

根据nodejs框架的不同,通常有两种方法来管理错误。

  • 扔掉它们(即throw new Error('invalid id');
  • 返回它们(即return { 400: 'invalid id' };

由于旧的建议是抛出错误效率低下,我总是尝试返回错误,但我更喜欢抛出错误,因为它们更方便。唯一一篇提到性能影响的文章是 Node v0.1。

这仍然是真的吗?


更新1

Nvm,我意识到我可以自己测试一下。以下代码供参考:

import { performance } from "perf_hooks";

function ThrowException() {
    throw new Error("invalid exception");
}
const _ATTEMPT = 1000000;
function ThrowingExceptions() {
    const p1 = performance.now();
    for (let i = 0; i < _ATTEMPT; i++) {
        try {
            ThrowException();
        } catch (ex: any) {
            // log error
        }
    }
    const p2 = performance.now();
    console.log(`ThrowingExceptions: ${p2 - p1}`);
} …
Run Code Online (Sandbox Code Playgroud)

javascript exception try-catch throw node.js

6
推荐指数
0
解决办法
1670
查看次数

在Java中抛出异常

我有一个关于在Java中抛出异常的问题,这似乎是我自己的一种误解,我想为自己澄清一下.

我一直在阅读处理异常代码的两种基本方法是:

1.)在一个带有"throw new ..."的try-block中抛出异常,然后立即在catch-block中捕获它 - 即所谓的try-throw-catch机制.

2.)在一个带有"throw new ..."的方法中抛出一个异常,然后在方法的标题中声明这个方法可能会抛出一个带有"throws ..."的异常 - 即所谓的pass-the-buck.

我最近读到过"抛出一个异常然后用相同的方法捕获它没有任何意义",这让我想到我是否以错误的方式理解了这个东西,或者写了这个东西的人有什么东西别的想法.处理异常的第一种方法不是这样(try-throw-catch机制)吗?我的意思是,它抛出异常并以相同的方法捕获它.我已经读过,在一个方法中抛出异常并在另一个方法中捕获它是一种更好的做法,但这只是一种(可能更好)的方法.另一种方式也是合法和正确的,不是吗?

请你对此发表评论吗?非常感谢你.

java exception-handling throw

5
推荐指数
2
解决办法
1万
查看次数

这被认为是内存泄漏吗?

一般规则,只有在免费存储区中分配的对象才会导致内存泄漏.但是在堆栈中创建的对象却没有.

这是我的疑问,

int main()
    {
      myclass x;

      ...

      throw;

      ...
    }
Run Code Online (Sandbox Code Playgroud)

如果不处理throw,则调用terminate(),然后调用abort()并使应用程序崩溃.此时,堆栈中的对象不会被破坏(不会调用析构函数).

我的理解是"当应用程序终止时(通过中止或正常退出),它释放了为应用程序分配的所有内存".因此,这不能被视为内存泄漏.

我对么?

c++ memory-leaks memory-management throw

5
推荐指数
1
解决办法
417
查看次数

不返回Java函数注释

有什么方法可以迫使编译器(注释或其他方法)实现一个Java函数永不返回(即始终抛出),以便随后它不会将其用法作为其他函数中的最后一个语句返回non void的错误。

这是一个简化/虚构的示例:

int add( int x, int y ) {
    throwNotImplemented();  // compiler error here: no return value.
}

// How can I annotate (or change) this function, so compiling add will not yield
// an error since this function always throws?
void throwNotImplemented() {
    ... some stuff here (generally logging, sometimes recovery, etc)
    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

java throw

5
推荐指数
1
解决办法
989
查看次数