我一直在阅读关于未经检查和已检查的问题,没有一个在线资源真正清楚这些差异以及何时使用两者.
根据我的理解,它们都会在运行时抛出,它们都代表超出逻辑预期范围的程序状态,但必须明确捕获已检查的异常,而未经检查的异常则不会.
我的问题是,假设为了论证我有一个方法来划分两个数字
double divide(double numerator, double denominator)
{ return numerator / denominator; }
Run Code Online (Sandbox Code Playgroud)
以及需要在某处使用divison的方法
void foo()
{ double a = divide(b, c); }
Run Code Online (Sandbox Code Playgroud)
谁负责检查分母为零的情况,是否应该检查或取消检查异常(忽略Java内置的分区检查)?
那么,除法方法是按原样还是按原样声明
double divide(double numerator, double denominator) throws DivideByZeroException
{
if(denominator == 0) throw DivideByZeroException
else ...
}
void foo()
{
try{
double a = divide(b, c);
}
catch(DivideByZeroException e)
{}
}
Run Code Online (Sandbox Code Playgroud)
或者没有经过检查的例外,原样如下:
double divide(double numerator, double denominator)
{
if(denominator == 0) throw DivideByZeroException
else ...
}
void foo()
{
if(c != 0)
double a = …Run Code Online (Sandbox Code Playgroud) 我有一个简单的javascript包,我正在尝试测试.我想检查是否抛出了错误,但是当我的测试运行并且抛出错误时,测试被标记为失败.
这是代码:
var should = require('chai').should(),
expect = require('chai').expect();
describe('#myTestSuite', function () {
it ('should check for TypeErrors', function () {
// Pulled straight from the 'throw' section of
// http://chaijs.com/api/bdd/
var err = new ReferenceError('This is a bad function.');
var fn = function () { throw err; }
expect(fn).to.throw(ReferenceError);
})
})
Run Code Online (Sandbox Code Playgroud)
哪个,运行时给我以下输出:
kh:testthing khrob$ npm test
> testthing@0.1.0 test /Users/khrob/testthing
> mocha
#myTestSuite
1) should check for TypeErrors
0 passing (5ms) 1 failing
1) #myTestSuite should check for TypeErrors: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个单元测试来检测我的类的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网络闭包时,处理错误的最佳和最现代的方法是什么?根据我的理解,任何异步网络功能都没有办法投入使用吗?
我是C++的新手,很抱歉提出非常愚蠢的问题,但我对C++的异常处理机制中的throw语句感到困惑.
class Except?我不理解那里的语法.
class A
{
public:
class Except{};
void foo() { throw Except(); }
};
int main()
{
A a;
try
{
a.foo();
}
catch(Except E)//exception handler
{
cout << "Catched exception" << endl;
}
}
Run Code Online (Sandbox Code Playgroud) 我有兴趣了解使用throw new Exception()和 的最佳实践new Exception()。在使用的情况下new Exception(),我已经看到代码移动到下一个语句而不是抛出异常。
但是我被告知我们应该使用new Exception()to throw RuntimeException。
任何人都可以对此有所了解吗?
投掷表达式适用于这种情况:
string myStr;
public MyObj( string myStr ) =>
this.myStr = myStr ?? throw new ArgumentNullException( "myStr" );
Run Code Online (Sandbox Code Playgroud)
但为什么不编译呢?
bool isRunning;
public void Run() =>
isRunning = !isRunning || throw new InvalidOperationException( "Already running" );
Run Code Online (Sandbox Code Playgroud) 我见过 3 种在 JavaScript 中抛出错误的不同方式:
throw 'message';
throw Error('message');
throw new Error('message');
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?
我试图在 Flutter/Dart 中找到一种方法来标记一个在执行过程中可能抛出异常的函数。在文档和谷歌中搜索一段时间后,我没有找到任何方法。
在其他语言中,例如 Swift、Java、Kotlin 等,我知道我们有这样的机制。Swift 中的示例代码是:
func doSomething() throws { ... }
Run Code Online (Sandbox Code Playgroud)
有谁知道这在 Dart 中是否存在?我认为它会很有用。
如果由于 Dart 语言设计它不存在,那么也许任何人都可以解释这个决定背后的原因。
提前致谢!