如果要重新抛出异常,请直接使用 throw ; 因为在 catch 块中使用 throw ex 会丢失堆栈信息,throw 则不会。当然,如果对异常不做任何处理,只是简单地重新抛出,这种做法也是不可取的。
var client = new HttpClient();
string? result = null;
try
{
result = await client.GetStringAsync("http://www.baidu.com");
}
catch(Exception ex)
{
//...一些处理异常的代码
// 直接使用 throw 而非 throw ex
throw;
}
return result;
有些初学者为了不让程序抛出异常,简单地用空 catch 语句吞没异常,这是典型的掩耳盗铃,非常坏的习惯!对于异常,要做相应的处理,至少也要重新抛出!
var client = new HttpClient();
string? result = null;
try
{
result = await client.GetStringAsync("http://www.baidu.com");
}
catch
{
// 错误,坚决杜绝!简单粗暴地
// 吞没了异常,典型的掩耳盗铃
}
return result;
var client = new HttpClient();
string? result = null;
try
{
result = await client.GetStringAsync("http://www.baidu.com");
}
catch (HttpRequestException ex)
{
// 处理 HttpRequestException 的代码
}
catch (TaskCanceledException ex)
{
// 处理 TaskCanceledException 的代码
result = null;
}
var client = new HttpClient();
string? result = null;
try
{
result = await client.GetStringAsync("http://www.baidu.com");
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.Forbidden)
{
// 处理 403 错误的代码
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
// 处理 404 错误的代码
}
return result;
产生异常后,应使用日志系统记录异常。记录异常时,应提供具体有意义的说明,同时记录异常对象本身。
catch (FileNotFoundException ex)
{
// 不推荐,信息太过模糊
this.logger.logError(ex,"发生了一些错误");
// 不推荐,没有记录异常对象本身,丢失了堆栈等重要信息
this.logger.logError("找不到请求的文件");
// 推荐,记录异常对象的同时提供有意义的说明
this.logger.LogError(ex, "找不到请求的文件");
}
因为系统预定义的异常知晓度高,语义明确,让第三方开发者更容易理解。比如:
在绝大多数情况下,系统预定义的异常足够使用了。只有在系统预定义异常无法满足要求的时候,才考虑自定义异常。自定义的异常应主要集中在业务和领域层面,异常的命名应该遵循 XxxException 的形式。
留言与评论(共有 0 条评论) “” |