如何使用c#捕获特定的异常?
在我的数据库中,某些列上有唯一索引.
当用户插入重复记录时,抛出此异常:
无法在对象'dbo中插入重复的键行.BillIdentity'具有独特的指数'IX _BillIdentity'.该语句已终止.
我怎么能抓住这个例外?
目前我正在检查使用此代码:
catch (Exception ex) {
if (ex.Message.Contains("Cannot insert duplicate key row in object 'dbo._BillIdentity' with unique index 'IX__BillIdentity")) {
string ScriptKey = "$(function() {ShowMessage('Error');});";
ScriptManager.RegisterStartupScript(Page, GetType(), "script", ScriptKey, true);
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得它的味道很难闻.
有没有更好的方法?
我正在重构由其他开发人员编写的中型WinForms应用程序,并且几乎每个类的每个方法都被一个try-catch块包围.99%的时间这些catch只阻止记录异常或清理资源并返回错误状态.
我认为很明显,这个应用程序缺乏适当的异常处理机制,我打算删除大多数try-catch块.
这样做有什么不利之处吗?你会怎么做?我打算:
要适当地记录异常并阻止它们传播给用户,请拥有一个Application.ThreadException处理程序
对于需要清理资源的情况,请保留try-catch块
更新:使用using或try-finally阻止是一种更好的方法.谢谢你的回复.
欢迎任何更正/建议.
编辑:在第3项中,"return-false-on-error"我的意思是这样的方法:
bool MethodThatDoesSomething() {
try {
DoSomething(); // might throw IOException
} catch(Exception e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我想把它重写为:
void MethodThatDoesSomething() {
DoSomething(); // might throw IOException
}
// try-catch in the caller instead of checking MethodThatDoesSomething's return value
try {
MethodThatDoesSomething()
} catch(IOException e) {
HandleException(e);
}
Run Code Online (Sandbox Code Playgroud) 在下面的示例中,Resharper在第一个花括号上显示"C#实验语言功能"工具提示.我已经检查了C#6.0的新功能,但没有遇到类似的功能.什么是参考实验功能?
class Class1
{
{ // <= C# Experimental language feature
}
}
Run Code Online (Sandbox Code Playgroud)
注意:.Net Framework 4.5编译器是错误的.
"类,结构或接口成员声明中的无效标记'{'"
在下面的测试中,我无法在使用yield return时真正打印Console.WriteLine.我正在尝试收益率回报,我理解我对它的理解中缺少了一些东西,但却无法弄清楚它是什么.为什么不打印里面的字符串PrintAllYield?
码:
class Misc1 {
public IEnumerable<string> PrintAllYield(IEnumerable<string> list) {
foreach(string s in list) {
Console.WriteLine(s); // doesn't print
yield return s;
}
}
public void PrintAll(IEnumerable<string> list) {
foreach(string s in list) {
Console.WriteLine(s); // surely prints OK
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
[TestFixture]
class MiscTests {
[Test]
public void YieldTest() {
string[] list = new[] { "foo", "bar" };
Misc1 test = new Misc1();
Console.WriteLine("Start PrintAllYield");
test.PrintAllYield(list);
Console.WriteLine("End PrintAllYield");
Console.WriteLine();
Console.WriteLine("Start PrintAll");
test.PrintAll(list);
Console.WriteLine("End PrintAll");
} …Run Code Online (Sandbox Code Playgroud) 我很长一段时间都对这个问题感到困惑.我使用System.Threading启动新线程,就像这样:
ParameterizedThreadStart threadFileExport = FileExport;
Thread threadExport = new Thread(threadFileExport)
{
IsBackground = true,
Name = "threadExport",
Priority = ThreadPriority.AboveNormal
};
threadExport.Start(_dataTable);
Run Code Online (Sandbox Code Playgroud)
和
public void FileExport(object objTable)
{
SaveFileDialog saveFileDialog = new SaveFileDialog
{
DefaultExt = "xlsx",
Filter = "Excel 2007-2010|*.xlsx|" +
"Excel95,97,2003|*.xls|",
FileName = "table.xlsx",
Title = "Save as. . ."
};
saveFileDialog.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)
但是对话框不会显示,并且在执行"ShowDialog"时线程似乎会立即中止.这是一个错误还是我弄错了?后台线程可以显示保存文件对话框吗?
我偶尔遇到的东西我不知道为什么会发生
如果我在按钮点击事件中采用一行简单的代码:
textbox1.Text = textbox2.Text;
Run Code Online (Sandbox Code Playgroud)
单击按钮时,textbox1中的文本消失,textbox2不会更新.两个文本框都将EnableViewState设置为true.
如果在页面加载时textbox1为null,则如果已从页面加载中的数据库填充,则textbox2将采用textbox1中的文本.
似乎无法在网上找到合适的解释,任何人都可以评论吗?
谢谢
我的项目是在C#.Net中,我们不想在任务栏上显示所选的应用程序.即具有UI,但客户希望它不应显示在任务栏上.
你能以任何方式提出建议吗?
@Edited问题