仅因为您决定使用catch块记录异常(意味着该异常根本没有发生变化)而抛出异常是一个坏主意。
我们使用异常,异常消息及其处理方式的原因之一是,让我们知道出了什么问题,并且聪明地编写异常可以大大加快查找错误的速度。
还要记住,处理异常要比使用拥有更多资源if
,因此要花更多的资源,所以您不应该仅仅因为自己喜欢就处理所有异常。它会影响应用程序的性能。
但是,使用异常作为标记出现错误的应用程序层的一种好方法。
考虑以下半伪代码:
interface ICache<T, U>
{
T GetValueByKey(U key); // may throw an CacheException
}
class FileCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from FileCache::getvalueByKey. The File could not be opened. Key: " + key);
}
}
class RedisCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: " + key);
}
}
class CacheableInt
{
ICache<int, int> cache;
ILogger logger;
public CacheableInt(ICache<int, int> cache, ILogger logger)
{
this.cache = cache;
this.logger = logger;
}
public int GetNumber(int key) // may throw service exception
{
int result;
try {
result = this.cache.GetValueByKey(key);
} catch (Exception e) {
this.logger.Error(e);
throw new ServiceException("CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: " + key);
}
return result;
}
}
class CacheableIntService
{
CacheableInt cacheableInt;
ILogger logger;
CacheableInt(CacheableInt cacheableInt, ILogger logger)
{
this.cacheableInt = cacheableInt;
this.logger = logger;
}
int GetNumberAndReturnCode(int key)
{
int number;
try {
number = this.cacheableInt.GetNumber(key);
} catch (Exception e) {
this.logger.Error(e);
return 500; // error code
}
return 200; // ok code
}
}
假设有人调用GetNumberAndReturnCode
并收到了500
代码,表示出现错误。他将致电支持人员,后者将打开日志文件并查看以下内容:
ERROR: 12:23:27 - Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: 28
ERROR: 12:23:27 - CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: 28
然后,开发人员立即知道导致该过程中止的软件的哪一层,并具有识别问题的简便方法。在这种情况下至关重要,因为Redis超时永远都不会发生。
也许另一个用户可以调用相同的方法,也可以接收500
代码,但是日志将显示以下内容:
INFO: 11:11:11- Could not retrieve object from RedisCache::getvalueByKey. Value does not exist for the key 28.
INFO: 11:11:11- CacheableInt::GetNumber failed, because the cache layer could not find any data for the key 28.
在这种情况下,支持人员可以简单地响应用户请求无效,因为他正在请求不存在的ID的值。
摘要
如果要处理异常,请确保以正确的方式处理它们。还要确保您的例外情况首先包括正确的数据/消息,紧随体系结构层之后,因此消息将帮助您识别可能发生的问题。