我正在尝试编写一个单元测试来检测我的类的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) 我使用了很多异步网络请求的(顺便说一句任何网络请求的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网络闭包时,处理错误的最佳和最现代的方法是什么?根据我的理解,任何异步网络功能都没有办法投入使用吗?
我有兴趣了解使用throw new Exception()和 的最佳实践new Exception()。在使用的情况下new Exception(),我已经看到代码移动到下一个语句而不是抛出异常。
但是我被告知我们应该使用new Exception()to throw RuntimeException。
任何人都可以对此有所了解吗?
我见过 3 种在 JavaScript 中抛出错误的不同方式:
throw 'message';
throw Error('message');
throw new Error('message');
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?
我正在为一个函数编写一个测试,并且必须触发该函数的 .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)
});
我接近这个的方式是错误的吗?这是茉莉花的错误吗?(谷歌没有找到任何东西)[我坚持(完成)设置,因为几乎所有其他测试都是异步的,我想保持这种风格]
[我无法更改要测试的代码]
我试图在 Flutter/Dart 中找到一种方法来标记一个在执行过程中可能抛出异常的函数。在文档和谷歌中搜索一段时间后,我没有找到任何方法。
在其他语言中,例如 Swift、Java、Kotlin 等,我知道我们有这样的机制。Swift 中的示例代码是:
func doSomething() throws { ... }
Run Code Online (Sandbox Code Playgroud)
有谁知道这在 Dart 中是否存在?我认为它会很有用。
如果由于 Dart 语言设计它不存在,那么也许任何人都可以解释这个决定背后的原因。
提前致谢!
根据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) 我有一个关于在Java中抛出异常的问题,这似乎是我自己的一种误解,我想为自己澄清一下.
我一直在阅读处理异常代码的两种基本方法是:
1.)在一个带有"throw new ..."的try-block中抛出异常,然后立即在catch-block中捕获它 - 即所谓的try-throw-catch机制.
2.)在一个带有"throw new ..."的方法中抛出一个异常,然后在方法的标题中声明这个方法可能会抛出一个带有"throws ..."的异常 - 即所谓的pass-the-buck.
我最近读到过"抛出一个异常然后用相同的方法捕获它没有任何意义",这让我想到我是否以错误的方式理解了这个东西,或者写了这个东西的人有什么东西别的想法.处理异常的第一种方法不是这样(try-throw-catch机制)吗?我的意思是,它抛出异常并以相同的方法捕获它.我已经读过,在一个方法中抛出异常并在另一个方法中捕获它是一种更好的做法,但这只是一种(可能更好)的方法.另一种方式也是合法和正确的,不是吗?
请你对此发表评论吗?非常感谢你.
一般规则,只有在免费存储区中分配的对象才会导致内存泄漏.但是在堆栈中创建的对象却没有.
这是我的疑问,
int main()
{
myclass x;
...
throw;
...
}
Run Code Online (Sandbox Code Playgroud)
如果不处理throw,则调用terminate(),然后调用abort()并使应用程序崩溃.此时,堆栈中的对象不会被破坏(不会调用析构函数).
我的理解是"当应用程序终止时(通过中止或正常退出),它释放了为应用程序分配的所有内存".因此,这不能被视为内存泄漏.
我对么?
有什么方法可以迫使编译器(注释或其他方法)实现一个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)
谢谢。
throw ×10
exception ×3
java ×3
javascript ×3
c++ ×2
try-catch ×2
asynchronous ×1
dart ×1
destructor ×1
flutter ×1
g++ ×1
jasmine ×1
memory-leaks ×1
node.js ×1
nserror ×1
swift ×1
testing ×1