我正在使用错误代码来处理我的c ++项目中的错误.问题是如何从一个应该返回一些变量/对象的函数返回错误代码.
考虑一下:
long val = myobject.doSomething();
Run Code Online (Sandbox Code Playgroud)
在这里,myobject是某个类的对象.如果doSomething函数遇到某些错误条件,那么它应该如何通知调用者(不使用异常).
可能的解决方案:
现在如何通知调用者一些错误情况?
问题:如果我想要的只是显示错误消息并关闭(假设我可能在程序中很深),是否正确使用异常来终止我的程序?我可以只显式调用exit()这样的东西吗?
我目前在做什么:
我正在开发一个游戏项目,并试图找出在需要执行此类操作的错误的情况下终止程序的最佳方法.例如,在无法加载纹理的情况下,我显示错误消息并终止程序.
我目前正在这样做,例如:
int main()
{
Game game;
try
{
game.run();
}
catch (BadResolutionException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Resolution");
return 1;
}
catch (BadAssetException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Assets");
return 1;
}
catch (std::bad_alloc & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Memory");
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
除了bad_alloc之外的所有内容都是我自己定义的从runtime_error派生的异常.
我不需要任何手动资源清理,我使用std :: unique_ptr进行任何动态分配.我只需要显示错误消息并关闭程序.
研究/替代例外:
我在SO和其他地方查了很多帖子,并且看到其他人说不要使用例外,使用例外,但你使用它们是错误的.我也查找过显式调用exit()之类的东西.
使用exit()听起来不错,但是我看到它不会通过调用堆栈返回主要清理所有内容(如果我能再次找到这个,我会发布链接).此外,根据http://www.cplusplus.com/reference/cstdlib/exit/,如果多个线程处于活动状态,则不应使用此选项.我确实希望在短时间内创建第二个线程至少一次,并且该线程可能会发生错误.
这里有一些关于游戏的回复中提到了不使用例外的问题https://gamedev.stackexchange.com/questions/103285/how-industy-games-handle-their-code-errors-and-exceptions
这里讨论了使用例外情况:http://www.quora.com/Why-do-some-people-recommend-not-using-exception-handling-in-C++
我读过其他一些资料,但那些是我最近看过的资料.
个人结论:
由于我处理错误处理和使用异常的经验有限,我不确定我是否走在正确的轨道上.我根据上面发布的代码选择了使用异常的路线.如果您同意我应该解决这些例外情况,我是否正确使用它?
假设您有一个表示错误代码的枚举.将有几个代码,每个代码都有自己的底层int值; 但是,获取默认值0的枚举值似乎应该仔细考虑.
在错误代码枚举的情况下,我可以想到两个特殊值:无(对于没有错误的情况)和未知(对于没有现有错误代码的情况,或者甚至当错误状态不能被发现).
其中一个值似乎应该为0,其他值可能会得到其他类似-1的值.将None值设置为0或将Unknown值设置为0更合适吗?
public enum ErrorCode
{
None = -1,
Unknown = 0,
InsufficientPermissions,
ConnectivityError,
...
}
public enum ErrorCode
{
Unknown = -1,
None = 0,
InsufficientPermissions,
ConnectivityError,
...
}
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我默认应该是未知,但我很好奇是否有人做了不同的事情.
编辑:
我只是意识到SaveChangesAsync返回0并不意味着它失败,实体框架在发生某些事情失败时总是会抛出异常,因此检查SaveChanges == 0是否多余!在下面的示例中,保存更改应始终返回1,如果失败,则将引发异常。
但是,在某些情况下,如果使用其他东西而不是实体框架,那么这个问题也适用。
服务器可能会失败,将所有数据访问代码放入控制器时,我可以通过以下方式处理:
[HttpPost]
public async Task<ActionResult<Item>> CreateAsync([FromBody] Item item)
{
await _dbContext.AddAsync(item);
if (await _dbContext.SaveChangesAsync() == 0)
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
return CreatedAtAction(nameof(GetAsync), new { id = item.Id }, item);
}
Run Code Online (Sandbox Code Playgroud)
当我的数据访问封装在服务层中时,应该如何处理?
public class ItemsService
{
public async Task<Item> CreateAsync(Item item)
{
await _dbContext.AddAsync(item);
if (await _dbContext.SaveChangesAsync() == 0)
{
return null;
}
return item;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,它将像这样使用:
[HttpPost]
public async Task<ActionResult<Item>> CreateAsync([FromBody] Item item)
{
// model state validation skipped for the sake of simplicity, …Run Code Online (Sandbox Code Playgroud) c# domain-driven-design entity-framework-core asp.net-core asp.net-core-webapi
我正在用c#编写一个登录类,我正在努力为空密码,密码不足的密码字符等抛出异常.突然发生的事情是 - 我怎么处理这些异常?他们是谁/他们是谁?无论我是否处理异常,该应用程序仍然会失败.是其他开发者的例外,客户!?
我有一些计算功能,用于驱动硬件设置的软件配置.在某些情况下,用户可能输入无效的配置值.我通过在使用无效值时抛出异常来处理此问题,或者只是在配置有效时返回我的计算值:
def calc_exhale_dur(breath_rate, inh_dur, breath_hold_dur):
"""Calculate exhalation duration.
Args:
breath_rate (float): animal breath rate (br/min)
inh_dur (float): animal inhalation duration (ms)
breath_hold_duration (float): animal breath hold duration (ms)
"""
single_breath_dur = calc_breath_dur(breath_rate)
exhale_dur = single_breath_dur - (inh_dur + breath_hold_dur)
if (inh_dur + breath_hold_dur + exhale_dur) > single_breath_dur:
raise error.ConfigurationError
elif exhale_dur <= 0:
raise error.ConfigurationError
else:
return exhale_dur
Run Code Online (Sandbox Code Playgroud)
以这种方式这样做被认为是不好的做法吗?如果有一个返回值,我是否总是需要一些有效的返回值?我正在努力学习如何最好地编写Pythonic代码,同时仍然满足我的计算方法的需要.
c# ×4
c++ ×3
asp.net-core ×1
c++11 ×1
enums ×1
exception ×1
python ×1
python-3.x ×1
raii ×1
return ×1