C#如何捕获异常并检查它是否包含字符串?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何捕获异常并检查它是否包含字符串?相关的知识,希望对你有一定的参考价值。
当用户权限足够时,我收到一个说“拒绝访问”的异常,如何捕获异常并检查“拒绝访问”,以便我可以向用户显示更友好的“拒绝访问被拒绝”消息?
谢谢初学者:-)
你真的不想检查消息的字符串,你想检查消息的类型,这可以通过只捕获你正在检查的异常类型轻松完成。以下示例将捕获两种不同类型的异常,并根据发生的错误执行不同的操作。 (注意:组成例外的名称)
try {
...
} catch (SomeKindOfException ex) {
MessageBox.Show(ex.Message);
} catch (AccessDeniedException ex) {
//Do something else
}
我认为这里最安全的事情(而且令人惊讶的是没有一个答案表明这一点)是
- 尽可能捕获特定的异常类型。真的试图避免捕获所有异常。
- 测试包含目标字符串的
string.ToLowerInvariant()
的异常消息。 - 重新
throw
如果它不是你所期望的!
像这样:
try
{
int result = DoStuff(param);
}
catch (System.IO.IOException ioex)
{
if (ioex.Message.ToLowerInvariant().Contains("find me"))
{
.. do whatever ..
}
else
{
// no idea what just happened; we gotta crash
throw;
}
}
如果您正在使用try catch块...
try
{
//error occurs
}
catch (Exception ex)
{
MessageBox.show(ex.Message);
}
显然,这是非常糟糕的错误处理,但它显示Exception对象包含错误字符串。您可以通过捕获不同的异常类型来缩小对不同异常的处理范围。
Try
{
//error occurs
}
catch (AccessDeniedException ex)
{
MessageBox.show(ex.Message);
}
catch (FieldAccessException)
{
}
// etc...
简单:
try
{
YourCommandWhichResultsInDeniedAccess();
}
catch (AccessDeniedException)
{
MessageBox.Show('Access Denied');
}
如果您不知道异常的类型和/或您想要检查异常消息,请执行以下操作:
try
{
YourCommandWhichResultsInDeniedAccess();
}
catch (Exception e)
{
if (e.Message == 'Access Denied')
{
MessageBox.Show('Access Denied')
}
}
使用exception filters in C# 6.0它更容易:
try
{
int result = DoStuff(param);
}
catch (IOException ex)
when (ex.Message.ToLowerInvariant().Contains("find me"))
{
//.. do whatever ..
}
旧式C#解决方案将是
try
{
int result = DoStuff(param);
}
catch (System.IO.IOException ex)
{
if (ex.Message.ToLowerInvariant().Contains("find me"))
{
//.. do whatever ..
}
else
{
throw;
}
}
如果是两种变体,您将获得相同的堆栈跟踪。在第一个变体中,在第二个变体中没有捕获异常,异常被追溯。但有一个重要的区别:
在异常过滤器的情况下:
- 堆栈跟踪被保留。
- 堆栈被保留。
如果是追赶投掷:
- 堆栈跟踪被保留。
- 堆栈未保留。
stack和stacktrace有什么区别?
Stacktrace是堆栈的快照。
实际上,您可以在这些变体中看到的唯一区别是您可以拥有不同的内存转储(如果您将C#和C ++结合使用)。
本土化
如果您正在捕获本地化为多种语言的某些第三方异常,并且您无法按类型或代码检查异常,请注意该消息可以本地化。有一个解决方法。您可以找到例外的英文消息。捕获异常,启动一个具有英语文化的新线程,并在具有英语文化的线程上读取消息属性,然后返回当前具有结果的线程。
结论
你应该使用异常过滤器,它不仅是语法糖,而且你也会有正确的内存转储。
您可以使用条件捕获功能:
try
{
// code here which throws exception
}
catch (Exception ex) when(ex.Message.Contains("Access Denied"))
{
MessageBox.Show("Sorry, Access Denied", "This is a polite error message");
}
只是从上面修改,但使用数据表和数据库和下拉列表
try {
drop_grup_head.SelectedValue = ds.Rows[0]["group_head"].ToString();
}
catch (Exception exce ) {
if (exce.Message.ToLowerInvariant().Contains("does not exist in the list")) {
drop_grup_head.SelectedValue = "0";
}
}
首先 - 应该查看权限问题而不是仅仅处理异常。如果抛出“拒绝访问”,则必须存在权限问题或某种锁定。
无论如何,“Message”是一个字符串,您可以使用.Contains方法检查“拒绝访问”。
您无法更改“Message”属性,因为它没有setter,但您可以处理异常并显示礼貌消息。
MessageBox.Show(“抱歉,访问被拒绝”);例如。
编辑:如上所述,您应该检查异常的类型。例如AccessDeniedException而不是像“Exception”那样使用泛型。
try
{
// code here which throws exception
}
catch (Exception ex)
{
if (ex.Message.Contains("Access Denied"))
{
MessageBox.Show("Sorry, Access Denied", "This is a polite error message");
}
}
以上是关于C#如何捕获异常并检查它是否包含字符串?的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中对资源使用 try 是不是安全 - 它是不是检查可关闭对象是不是不为空,是不是在尝试关闭它时捕获异常