在处理REST API调用的此函数中,处理部分请求的任何被调用函数都可能抛出错误,表示应将错误代码作为响应发送.但是,函数本身也可能发现错误,此时它应该跳转到异常处理块.
static async handleRequest(req) {
try {
let isAllowed = await checkIfIsAllowed(req);
if (!isAllowed) {
throw new ForbiddenException("You're not allowed to do that.");
}
let result = await doSomething(req); // can also raise exceptions
sendResult(result);
} catch(err) {
sendErrorCode(err);
}
}
Run Code Online (Sandbox Code Playgroud)
Webstorm将throw使用以下消息强调:'throw' of exception caught locally. This inspection reports any instances of JavaScript throw statements whose exceptions are always caught by containing try statements. Using throw statements as a "goto" to change the local flow of …
我下面的代码给了我一个NullReferenceException和堆栈跟踪告诉我问题在于Count方法,所以我很确定在某个时候foo,bar或者baz是null.
我的代码:
IQueryable<IGrouping<string, Referral>> queryable= ...;
var dict = queryable.ToDictionary(g => g.Key.ToString(),
g => g.Count(r => r.foo.bar.baz.dummy == "Success"));
Run Code Online (Sandbox Code Playgroud)
我想知道处理null案件的简洁方法是什么.我知道在C#6.0中我可以做到foo?.bar?.baz?.dummy,但我正在研究的项目不是C#6.0
考虑以下玩具代码以确定范围是否包含元素:
template<typename Iter, typename T>
bool contains1(Iter begin, Iter end, const T& x)
{
for (; begin != end; ++begin)
{
if (*begin == x) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
(是的,我知道,标准库中已有完美的算法,但这不是重点.)
我怎么用for_each和lambda 写同样的东西?以下不起作用......
template<typename Iter, typename T>
bool contains2(Iter begin, Iter end, const T& x)
{
std::for_each(begin, end, [&x](const T& y) {
if (x == y) return true;
});
return false;
}
Run Code Online (Sandbox Code Playgroud)
...因为那只会从lambda返回,而不是从函数返回.
我是否必须抛出异常以摆脱lambda?同样,对于这个特定问题可能有十几个更好的解决方案,根本不涉及lambda,但这不是我要求的.
我有一个值列表,其中一些可能是列表/集合或单个值.在JavaScript表示法中,它可能看起来像:
const input = [1,2,[3,4], [5,6], 7];
Run Code Online (Sandbox Code Playgroud)
我想得到:
const concatenated = [1,2,3,4,5,6,7];
Run Code Online (Sandbox Code Playgroud)
所以我有这个Java代码:
ArrayList<T> concatenated = new ArrayList<>();
for (T v : input) {
try{
concatenated.addAll((Collection) v);
}
catch (Exception e1){
try{
concatenated.addAll((List) v);
}
catch (Exception e2){
concatenated.add(v);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但那段代码对我来说似乎很糟糕.首先我不知道是否尝试强制转换为List或Collection是否足够 - 是否还有其他类型我应该尝试强制转换?有什么错误我不应该忽略吗?
怎么做对了?
这可能是一个广泛的问题,不是那种风格,但我仍然希望得到一些提示或指导方针.
我一直在查看一些遗留代码,并发现其中一部分具有嵌套3或4级异常的方法.
这被认为是正常的做法还是应该尽可能避免这种代码风格?如果应该避免,除了异常处理成本增加和可读性降低之外还有哪些负面影响?是否有通用的方法来重构代码以避免这种情况?
我正在使用Vaadin文本字段,我想限制它仅支持数字.我试图覆盖setValue()并返回而不调用super.setValue() 如果文本不是数字.但它似乎没有起作用.我怎么能纠正这个?我正在使用Vaadin 7.我认为它也不支持NumberField.
我正在研究C#泛型函数.当出错时,如果泛型类型可以是新的,则返回new T(),否则返回default(T).
像这样的代码:
private T Func<T>()
{
try
{
// try to do something...
}
catch (Exception exception)
{
if (T is new-able) // <---------- How to do this?
{
return new T();
}
else
{
return default(T);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道where T : new()那些使用它的人需要new T().这个问题是,如何在运行时判断这个?
我有一个包含userId和注释的数据库.用户不知道数据库中是否已有注释,因此他们写了一个并单击"提交"按钮.如果没有userId的注释或更新userId已经存在的注释,我想插入此注释:
notesDb.open();
boolean updateResult = notesDb.updateMessage(
userId,
details_notes_input.getText().toString());
if(updateResult == true) {
Log.d("databaseTester", "Updated entry into table");
} else {
Log.d("databaseTester", "FAILED to update entry into table");
long insertResult = notesDb.insertMessage(
userId,
details_notes_input.getText().toString());
if(insertResult == -1){
Log.d("databaseTester", "Failed to insert entry into table");
} else {
Log.d("databaseTester", "Inserted entry into table");
}
}
notesDb.close();
Run Code Online (Sandbox Code Playgroud)
所以,我几乎试图'更新'一个条目,如果我失败了,那么我试图'插入'它.我不太了解SQL,但我认为会有更好的方法.谢谢.
我有一段代码,看起来像这样:
try {
if( !request.body || !request.body.device ) {
throw new FooError( "missing 'device'" );
}
if( !request.body.device.type ) {
throw new BarError( "missing 'device.type'" );
}
if( request.body.device.type != "ios" ) {
throw new BazError( "unexpected 'device.type'" );
}
} catch( error ) {
// handle error and communicate message to the user
}
Run Code Online (Sandbox Code Playgroud)
WebStorm 突出显示了 3 个throw术语并给出了以下解释:
在本地捕获异常的“抛出”
此检查报告任何 JavaScript throw语句的实例,其异常总是通过包含try语句来捕获。使用throw语句作为“转到”来更改本地控制流可能会造成混淆。
我不明白这个道理。为什么这可能会令人困惑,什么是不那么令人困惑的选择?
我被分配了一个项目来开发一组作为存储系统接口的类.要求是该类支持具有以下签名的get方法:
public CustomObject get(String key, Date ifModifiedSince)
Run Code Online (Sandbox Code Playgroud)
基本上该方法应该返回CustomObject与keyif 关联的,并且只有在对象被修改之后才会返回ifModifiedSince.如果存储系统不包含,key则该方法应返回null.
我的问题是:
如何处理其中关键的存在,但该对象的情景已经不被修改?
这很重要,因为使用此类的一些应用程序将是Web服务和Web应用程序.这些应用程序需要知道是返回404(未找到),304(未修改)还是200(OK,这是数据).
我正在权衡的解决方案是:
keyifModifiedSince失败时抛出自定义异常
.我对这三个选项中的任何一个都不满意.我不喜欢选项1和2,因为我不喜欢使用流控制的异常.当我的目的是表明没有价值时,我也不喜欢返回值.
尽管如此,我倾向于选择3.
有没有我不考虑的选择?有没有人对这三种选择中的任何一种都有强烈的感受?
这个问题的答案,转述:
contains
方法并要求调用者在调用之前调用它get(key,
ifModifiedSince),如果key不存在则抛出异常,如果没有修改object则返回null.UNMODIFIED, KEY_DOES_NOT_EXIST).为什么我不能选择答案#1
我同意这是理想的解决方案,但我已经(不情愿地)被解雇了.这种方法的问题在于,在大多数使用这些类的情况下,后端存储系统将是第三方远程系统,如Amazon S3.这意味着一种contains方法需要往返于存储系统,这在大多数情况下会进行另一次往返.因为这会花费时间和金钱,所以不是一种选择.
如果没有这个限制,这将是最好的方法.
(我意识到我没有在这个问题中提到这个重要元素,但我试图保持简短.显然它是相关的.)
结论:
在阅读完所有答案之后,我得出的结论是,在这种情况下,包装器是最好的方法.基本上我会模仿HTTP,包括响应代码和内容正文(消息)的元数据(标题).