第7章 VB NET异常处理
- 格式:doc
- 大小:120.50 KB
- 文档页数:5
vb错误处理第一篇:vb错误处理Vb错误处理出错处理(1)设置错误陷阱On Error Resume Next若出现错误,则将当前错误语句忽略,执行下条语句。
On Error GoTo 语句标号On Error GoTo 0 不进行任何处理(2)编写错误处理程序Resume:接着错误的地方执行,重试。
Resume Next:类似On Error Resume Next,忽略当前错误语句,执行下一语句Resume :到标号那里去处理。
过程级、模块级节选:Onerrorgoto标签是放在错误发生之前,有效范围是到此事件的结束,包括错误处理时发生的错误。
(此时的错误一般是没有想到的,故也没有处理)所以要保证不要在错误处理的代码中写复杂的代码。
OnErrorGotoErr_Normal'一般代码sql= “insertinto......”OnErrorGotoErr_Rolladocn.BeginTransmitTransOnErrorGotoErr_Normal....ExitsubErr_Normal:'正常错误处理ExitSubvb6.0 遇到错误能不退出吗2012-1-25 20:04提问者:咫·尺 | 浏览次数:278次比如遇到数据溢出啊等,弹出错误以后,就直接把程序关闭了,数据都没保存,能弹出错误后,不关闭程序吗?满意回答插入以下代码:On Error Resume Next即可。
意思是,程序遇到错误不理会,继续执行。
或者使用GoTo,比如下面的代码计算肯定是溢出的,但程序不会退出,不过会提示: On Error GoT o ToExitDim g, ErrNum As Booleang = 1Do Until ErrNumg = g * 1024LoopToExit:If Err.Number = 6 ThenPrint “程序溢出,计算结果不准确”, gExit SubEnd If或者使用以下代码,可以完全显示计算过程:Dim WithEvents List As ListBoxPrivate Sub Form_Load()On Error GoTo ToExitDim g, ErrNum As Booleang = 1Set List = Me.Controls.Add(“VB.ListBox”, “List”)With List.Left = 0.Top = 0.Width = Form1.Width490.Visible = TrueEnd WithDo Until ErrNumg = g * 1024List.AddItem gLoopToExit:If Err.Number = 6 ThenList.AddItem “程序溢出,计算结果不准确” & gExit SubEnd IfEnd Sub追问是不是要在每一个容易出错的sub里面都要这样加一下?有没有整体设置一下或者写代码的?每个sub都写一下也挺麻烦的回答首先,第一行是每个里边都需要有的,有了这一行,才会执行错误跳转。
.NET异常处理规范基本原则:上层应用中所有的异常均需要捕获并处理,防止程序异常退出以下要点请注意:1、没有判断变量是否为空,直接使用:例如:string s = .ToString(); //Name从数据库查出来,可能为null foreach (Column c in table.Columns) //Columns为数组,从数据库查出来,可能为null 建议:object.ToString()最好写成Convert.ToString(object)2、集合变量长度为零,却在直接使用项例如:foreach (object obj in objList){comboBox.Items.Add(obj);}comboBox.Items[0].Selected = true; //可能出异常3、对类型转换没有注意例如:object obj = 1;string str = (string)obj; //此处将出异常正确的写法为:if (obj is string){string str = (string)obj;//处理str}或者string str = obj as string;if (str != null){//处理str}4、Dictionary<T1, T2>类使用注意事项Add方法和TryGetValue方法中的参数key均不能为空和Hashtable不同,Dictionary<T1, T2>直接通过索引器获取项时,当key对应的项不存在时,将抛出异常,因此推荐用法为:object value = null;If (dict.TryGetValue(key, out value)){//处理}或者If (dict.ContainsKey(key)){object value = dict[key];// 处理}5、文件处理时的异常文件处理时,一定要对路径是否存在,文件是否存在,文件是否只读进行相应的判断6、线程异常多线程程序中,其他线程的异常在主线程中无法捕捉到,就算是用了AppDomain也不行。
的出错处理
中的出错处理是使用excetions而不是ON Error GOTO语法来实现的,ON Error GOTO现在已经不支持了,Visual Basic现在提供一个结构化的出错处理过程,使用Try...Catch...Finally表述。
结构化的出错处理过程是和exceptions 有关的,类似于Select Case或者While的一个具有选择关系的代码结构。
这使得程序的代码更具有健壮性,可以进行更加复杂的错误处理。
exceptions的运行机理是这样的,当有错误出现时,错误处理过程就会屏蔽掉使得在Try模块中产生错误的运行代码,并且使用Catch表述来获取错误,语法如下:
首先,运行Try模块中的代码,如果没有错误的话就接着运行Finally模块里的代码,如果有错误的话,就运行Catch
模块里的代码,在Catch模块里用户可以做出一些出错处理,然后接着运行Finally模块里的代码并退出整个模块。
下面的例子就是显示怎样进行出错处理的设置,当用户访问一个数组列表时,超过列表的长度以后,就会产生一个错误,代码如下:
上面的例子把错误信息打印出来,并且指出代码产生错误的位置,并且继续运行下去。
下面就是运行的结果:
相反,如果用户不进行错误处理的话,将在运行的时候从系统得到错误的信息,并且直接退出运行环境,而不是继续运行下去。
系统将会出现如下错误信息:。
VBA处理异常情况的方法与示例在VBA编程中,处理异常情况是一项至关重要的任务。
当程序在执行过程中遇到错误或异常情况时,如果没有妥善的处理机制,可能会导致程序崩溃或产生不可预测的结果。
因此,了解如何处理异常情况是编写稳定和可靠的VBA代码的关键。
本文将介绍VBA处理异常情况的常用方法和示例,帮助您更好地处理和调试程序中的错误。
1. 使用On Error语句On Error语句是VBA中处理异常情况的基本方式。
它允许您指定一段代码块,以便在发生错误时执行特定的操作。
示例:```vbaSub ErrorHandlerExample()On Error GoTo ErrorHandlerDim num1 As IntegerDim num2 As IntegerDim result As Doublenum1 = 10num2 = 0result = num1 / num2MsgBox "The result is: " & resultExit SubErrorHandler:MsgBox "An error has occurred: " & Err.DescriptionEnd Sub```在上述示例中,我们尝试将一个数值除以零,这将引发一个类型为11的运行时错误(除以零错误)。
当出现错误时,代码将跳转到标签为"ErrorHandler"的代码块,并显示一个消息框来显示错误描述。
通过这种方式,我们可以捕捉错误并按照需要进行处理。
2. 使用Err对象获取错误信息在VBA中,Err对象用于访问有关发生的错误的信息。
它提供了许多属性,可以帮助我们识别和处理错误。
示例:```vbaSub ErrorHandlerExample2()On Error GoTo ErrorHandlerDim filePath As StringfilePath = "C:\NonExistingFile.txt"Open filePath For Input As #1Close #1Exit SubErrorHandler:MsgBox "An error has occurred: " & Err.DescriptionIf Err.Number = 53 ThenMsgBox "File not found!"End IfEnd Sub```在上述示例中,我们尝试打开一个不存在的文件。
vbnet教程 是一种由微软开发的面向对象的编程语言,用于开发应用程序和网站。
本教程旨在帮助初学者了解 的基本概念和语法。
以下是一些重要的主题。
变量和数据类型在 中,您可以使用变量来存储数据。
变量需要一个数据类型来确定可以存储的值的范围。
常见的数据类型包括整数、浮点数、字符串和布尔值。
您可以使用关键字 Dim 来声明变量。
条件语句条件语句用于根据给定的条件执行不同的操作。
在 中,您可以使用 If-Then、If-Then-Else 和 Switch 语句来实现条件逻辑。
循环循环语句用于重复执行特定的代码块。
提供了几种类型的循环,包括 For 循环、While 循环和 Do-While 循环。
这些循环结构可以根据特定的条件来控制循环的次数。
数组数组是一种用于存储多个相同类型的值的数据结构。
在 中,您可以使用关键字 Dim 来声明数组,并使用索引访问数组元素。
函数和过程函数和过程是可重用的代码块。
函数返回一个值,而过程不返回任何值。
您可以使用关键字 Function 和 Sub 来定义函数和过程,并使用关键字 Return 和 Exit Sub 来返回值。
面向对象编程 是一种面向对象的编程语言,支持封装、继承和多态。
您可以使用类来创建对象,使用属性和方法来访问和操作对象的状态和行为。
异常处理异常处理用于捕获和处理程序中可能出现的错误。
在 中,您可以使用 Try-Catch-Finally 块来捕获和处理异常。
文件操作 提供了许多用于读取和写入文件的功能。
您可以使用关键字 File 和 Directory 来操作文件和目录。
以上是一些 的基本概念和语法。
通过学习这些内容,您将能够开始编写简单的 程序。
希望本教程对您有所帮助!。
是一种基于VB语言的面向对象程序设计语言,它是微软推出的一种用于开发Windows评台应用程序的工具。
在中,文件的读写是非常常见的操作,我们可以通过一些API来实现文件的读写操作。
在本文中,我将介绍如何在中进行文件的读写操作,包括文件的打开、读取、写入和关闭等操作。
希望通过本文的介绍,能够帮助大家更好地掌握中文件读写的用法。
一、文件的打开在中,我们可以使用FileStream类来打开一个文件。
FileStream类是用于提供文件的读写操作的一个类,通过它我们可以打开一个文件,并进行读写操作。
下面是一个打开文件的示例代码:Dim fs As FileStream = New FileStream("C:\test.txt", FileMode.Open)在上面的代码中,我们首先创建了一个FileStream对象,并以"test.txt"为文件名,以FileMode.Open的方式来打开了这个文件。
通过这个代码,我们就可以在中打开一个文件了。
二、文件的读取在中,我们可以使用StreamReader类来进行文件的读取操作。
StreamReader类是用于读取文件内容的一个类,通过它我们可以方便地读取文件的内容。
下面是一个读取文件的示例代码:Dim sr As StreamReader = New StreamReader("C:\test.txt")Dim content As Stringcontent = sr.ReadToEnd()Console.WriteLine(content)在上面的代码中,我们首先创建了一个StreamReader对象,并以"test.txt"为文件名来创建了这个对象。
然后我们通过sr.ReadToEnd()方法来将整个文件的内容读取到content变量中,并最后将content的内容输出到控制台上。
VBA中的错误处理和异常情况处理指南在使用VBA编写代码时,错误处理和异常情况处理是至关重要的。
良好的错误处理可以确保代码在遇到错误时能够正确地执行并给出适当的反馈,提高代码的稳定性和可靠性。
本文将介绍VBA中常见的错误处理方法和技巧,帮助您编写更健壮的代码。
一、错误处理基础1. 常见的错误类型VBA中的错误类型包括语法错误、运行时错误、逻辑错误等。
语法错误是最常见的错误类型,例如拼写错误、未声明的变量等。
运行时错误是在代码执行时发生的错误,常见的运行时错误包括除以零、数组越界等。
逻辑错误是代码逻辑的错误,导致程序不按预期的方式执行。
2. VBA错误处理语句VBA提供了一些专门用于处理错误的语句,包括On Error语句、Err对象和Resume语句。
On Error语句用于定义错误处理的行为。
常见的用法包括On Error Resume Next(忽略错误并继续执行下一条语句)、On Error GoTo [label](跳转到指定的错误处理标签)。
Err对象用于获取有关错误的信息,包括错误代码、错误描述等。
可以使用Err.Number获取错误代码,Err.Description获取错误描述。
Resume语句用于控制程序在错误发生后的执行流程。
可以使用Resume语句恢复程序的执行,也可以使用Resume Next跳过错误继续执行。
3. 错误处理的注意事项在编写错误处理代码时,需要注意以下几个方面:- 尽量避免使用全局错误处理,应尽早发现和处理错误,以便于定位和修复问题。
- 不要忽略所有异常情况,遇到严重错误时应适当提醒用户并终止程序的执行。
- 在处理错误时,应给出明确的错误信息,帮助用户理解错误的原因和解决方法。
- 在编写错误处理代码时,应考虑各种可能的异常情况,并给出相应的处理逻辑。
二、常见的错误处理场景1. 检测语法错误在使用VBA编写代码时,经常会出现语法错误,例如拼写错误、未声明的变量等。
VBA编程中的错误处理与异常处理技巧VBA(Visual Basic for Applications)是一种用于编写宏和自定义函数的编程语言,广泛应用于Microsoft Office套件中的各种应用程序,如Excel、Word和Access。
在编写任何一种程序时,错误和异常是难以避免的。
因此,掌握VBA编程中的错误处理和异常处理技巧是非常重要的。
错误处理是指在程序执行过程中,一旦发生错误,通过适当的处理方式处理该错误,使程序能够继续执行下去。
若干常见的错误处理技巧如下:1. 使用On Error语句:On Error语句用于指定程序错误处理的状态。
通过使用On Error语句,我们可以定义当代码中发生错误时应采取的行动。
例如,可以使用On Error Resume Next语句来忽略错误并继续执行下一行代码,或者使用On Error GoTo语句来指定一个错误处理程序的位置。
2. 使用Err对象:Err对象可以用于获取关于错误的详细信息,例如错误号、错误描述等。
通过Err对象,我们可以根据返回的错误号决定应该采取哪种错误处理方式。
3. 使用MsgBox函数:MsgBox函数可以在错误处理过程中向用户显示一条信息,如“发生错误,请联系管理员”。
这样可以提醒用户程序执行过程中出现了问题,需要管理员的干预或帮助。
4. 使用重试和回滚:有时候,在程序执行过程中发生了错误,我们可能需要重复执行一些操作,或者回滚到先前的状态。
这可以通过循环结构和条件语句来实现,以便在错误发生时重新尝试或者撤销临时更改。
除了错误处理之外,在编程过程中还需要注意异常处理。
异常是指程序执行过程中出现的不可预测的事件,如无效输入、系统错误等。
异常处理的目标是使程序能够优雅地处理这些异常情况,避免程序崩溃或产生未控制的结果。
以下是一些处理异常的技巧:1. 使用Try-Catch语句:Try-Catch语句用于捕捉和处理异常。
在Try块中编写可能会引发异常的代码,如果出现异常,程序将跳转到Catch块,执行异常处理代码。
VBA 中如何处理异常与错误情况VBA(Visual Basic for Applications)是一种用于自动化任务和宏编程的编程语言。
在处理大量数据和执行复杂的操作时,无论是在Excel、Access 还是其他 Office 应用程序中,都有可能发生错误和异常情况。
为了确保代码的健壮性和可靠性,我们需要掌握处理异常和错误的技巧。
1. 使用 VBA 的错误处理语句VBA 提供了一些特殊的语句来处理错误和异常情况。
其中最重要的是 On Error 语句。
通过使用 On Error 语句,我们可以定义一段代码,以便在出现错误时进行处理。
例如,可以使用以下语句定义一个错误处理程序:```vbaOn Error GoTo ErrorHandler```然后,在代码的适当位置使用 ErrorHandler 作为标签,来指定错误处理的逻辑。
例如:```vbaErrorHandler:MsgBox "出现错误:" & Err.Description```上述代码中,如果任何错误发生,代码将跳转到ErrorHandler 标签,在弹出消息框中显示错误的描述。
2. VB 的错误对象在 VBA 中,错误信息由专门的错误对象 Err 来管理。
Err 对象包含了一些属性,可以提供有关错误的详细信息。
最常用的是 Description属性,它可以返回关于错误的文字描述。
在错误处理程序中,可以使用Err 对象来获取错误信息并进行处理。
以下是一个示例:```vbaErrorHandler:MsgBox "出现错误:" & Err.DescriptionErr.Clear```上述代码中,首先使用 Err.Description 显示错误信息,然后使用Err.Clear 清除错误对象,以便在下一次发生错误时初始化该对象。
3. VBA 中的异常处理和错误处理不同,异常处理是通过一些条件和逻辑检查来避免代码产生错误。
.NET学习之.NET Framework的异常处理机制几番决心之后,决定写这个.NET学习系列,算是对平时积累下来的知识点一个回顾和总结,为自己建立起一个系统的知识体系打好基础,也顺便提高一下自己的语言组织能力。
好了,废话也不多说,入正题。
本章主要分下面几个方面来介绍.NET Framework的异常处理机制。
一、什么是异常?二、异常是怎么产生的?三、.NET Framework是如何来处理异常的?四、异常处理实例。
一、什么是异常?异常(exception)是程序在运行时所产生的一种事件,这种事件往往是非预期的,并且会打断程序的正常运行流程。
我们应当注意异常与错误(error)之间的区别,这里有个比较正式的解释,“一个异常是在一个程序执行过程中出现的一个事件,它中断了正常指令的运行--Mary Campione 《The Java Tutorial》”,而错误是“偏离了可接受的代码行为的一个动作或一个实例 --From American Heritage Dictionary”.有点晦涩难懂吧?我认为错误与异常是存在交集的,不可能完全区分,狭义的异常就是错误。
二、异常是怎么产生的?不管你的编程能力有多高,仍然可能面对很多意料之外的情况,例如,你的程序需要读写客户机上的某一个文件但并没有获得对该文件的写权限,在进行同服务器之间通信时网络突然中断,这些意料之外的情况都可能引发程序的异常。
三、.NET Framework是如何来处理异常的?在.NET框架中,当出现某个异常时,会创建一个异常对象。
这个异常对象包含了有助于跟踪问题的相关信息。
针对于普遍性的异常情况,.NET提供了许多预定义的异常类。
同时,也允许我们通过创建自己的异常类来跟踪特定的应用程序异常。
首先,我们来看.NET的异常类层次结构。
在.NET中,所有异常类都是派生于Exception基类。
当然,Exception基类是从Object 类派生出来的。
VBA中的错误处理和异常情况排查在VBA编程中,错误处理和异常情况排查是非常重要的,能够帮助我们在程序运行中遇到错误或异常情况时进行有效的处理和排查。
本文将介绍VBA中常用的错误处理方法和技巧,以及如何排查异常情况。
1. VBA中的错误处理方法在VBA编程中,我们可以使用多种方法来处理错误,其中最常用的是使用“On Error”语句。
下面是在VBA中使用“On Error”语句处理错误的基本格式:```On Error GoTo ErrorHandler```以上代码将运行时错误转移到名为“ErrorHandler”的标签处。
在“ErrorHandler”标签处,我们通常会编写一些代码,用于处理错误并提供适当的错误提示或修复措施。
以下是一个简单的示例:```Sub ErrorHandlingExample()On Error GoTo ErrorHandler' 执行可能引发错误的代码x = 10 / 0' 错误处理代码Exit SubErrorHandler:MsgBox "发生错误:" & Err.DescriptionEnd Sub```在上面的示例中,如果执行代码 `x = 10 / 0` 时出现除零错误,程序会跳转到`ErrorHandler` 标签处,并显示一个消息框,提示错误信息。
在错误处理代码中,我们通常会用 `Err` 对象来获取错误信息,其中 `Err.Description` 属性返回错误的描述信息。
除了上述的单个错误处理,我们还可以使用 `Resume` 语句来控制错误处理流程。
例如,我们可以使用 `Resume Next` 语句来忽略错误并继续执行下一条语句;使用 `Resume` 语句跳过当前错误处理过程并继续执行下一条可执行语句;使用`Resume LineLabel` 语句跳转到指定的标签处继续执行。
2. 异常情况排查技巧在编写VBA程序时,我们常常会遇到各种异常情况,如错误的变量赋值、空对象访问等。
浅谈Visual Basic .NET中的异常处理
刘贵君
【期刊名称】《无线互联科技》
【年(卷),期】2012(000)005
【摘要】Visual (以下简称)作为.NET的主要语言之一,实际应用非常广泛,引起了广大学生、程序开发人员的学习兴趣.本文通过论讨Visual 中的异常处理方法,以提高程序开发人员在编写程序时解决处理错误的能力.
【总页数】1页(P130-130)
【作者】刘贵君
【作者单位】黑龙江科技学院利民学院,黑龙江哈尔滨 150001
【正文语种】中文
【相关文献】
1.浅谈Visual 中资源文件的使用 [J], 林海菁;刘珍
及在Visual 窗体中的应用研究 [J], 袁小玲
3.《Visual 程序设计》教学中的问题及对策 [J], 闫淼
中Visual 、和C#语言的区别 [J], 贺军;李喜梅
5.浅谈Visual [J], 关沧
因版权原因,仅展示原文概要,查看原文内容请购买。
之错误异常处理相对于VB⽽⾔,中引⼊了很多特⾊。
当中最吸引我的就是引⼊了结构化异常处理。
尽管仍然⽀持OnError Goto类型的异常处理,可是这样做并⾮⾮常好。
相⽐⽽⾔,结构化异常处理更加灵活,使⽤更加⽅便。
我们应该充分利⽤提供的结构化异常处理。
在结构中的异常处理分为3个语句块。
(1)try块负责错误代码的捕获(2)catch进⾏错误的处理(3)finally负责错误处理后的兴许⼯作如:释放对象、清理资源等的⼯作。
使⽤这些区块的⽬的是同意执⾏Try模块中被保护的代码,对catch,对catch区块中可能分不论什么错误做出反应。
⽽且在随后的Finally块中还有清理代码。
不管Try代码块是否有发⽣错误,Finally块的代码都会被执⾏到,这样能够⾮常⽅便的保证分配的资源会被释放,⽽且能够⽅便地提供那些不论错误控制细节怎样,都须要被执⾏的各种功能的函数。
可是,Catch语句块不⼀定执⾏,假设Try块内的代码没有错误,没有抛出异常的话,Catch语句块中的代码是不执⾏的。
⽽是跳过Catch块直接执⾏Finally块中的清理⼯作。
反之假设遇到了异常Catch语句块中的处理⼯作就要进⾏。
以下举个实例:Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim file As System.IO.FileStream, msg As StringTryfile = New System.IO.FileStream("D:\readme.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read)file.Close()Catch ex As Exceptionmsg = String.Format("{0}ralsed exception :{1}", ex.Source, ex.Message)MessageBox.Show(msg, "My App", MessageBoxButtons.OK, MessageBoxIcon.Error)FinallyIf Not file Is Nothing Then file.Close()End TryEnd Sub这个样例是在D盘找到⼀个readme.txt⽂档。
详谈.NET的异常处理年关将⾄,对于⼤部分程序员来说,马上就可以闲下来⼀段时间了,然⽽在这个闲暇的时间⾥,唯有争论哪门语⾔更好可以消磨时光,估计最近会有很多关于java与.net的博⽂出现,我表⽰要作为⼀个吃⽠群众,静静的看着⼤佬们发表⼼情。
以上的废话说的够多了,这⾥就不再废话了,还是切⼊正题吧。
在项⽬开发中,对于系统和代码的稳定性和容错性都是有对应的要求。
实际开发项⽬中的代码与样例代码的区别,更多的是在代码的运⾏的稳定性、容错性、扩展性的⽐较。
因为对于实现⼀个功能来说,实现功能的核⼼代码是⼀样的,可能只是在写法上优化⽽已,但是在实现某⼀个操作上使⽤的类来说,这⼀点是绝⼤多数时候是⼀样的。
这样看来,我们在实际开发的过程中,需要考虑的问题⽐较多,已经不仅仅局限于某⼀具体的功能实现,更多的是代码的稳定性和扩展性考虑。
以上是在实际开发中需要⾯对的问题,笔者在最近的博⽂中,也在考虑这个异常到底需要怎么去写,以及异常到底需要怎么去理解,在博⽂中,也有不少的园友对异常的写法和处理提出了⾃⼰的意见,在这⾥我就写⼀下⾃⼰的⼀些理解,可能写的⽐较浅显和粗略,但是只当是⼀个引⼦,可以引出⼤佬们来谈谈⾃⼰的实际项⽬经验。
希望对⼤家有⼀个帮助,也欢迎⼤家提出⾃⼰的想法和意见,分享⾃⼰的知识和见解。
⼀.DotNET异常的概述:谈到异常,我们就需要知道什么叫做异常,万事万物如果我们想去学习,就应该知道我们要学习的东西是什么,这样在⼼⾥也好有⼀个⼤概的认知。
异常是指成员没有完成它的名称宣称可以完成的⾏动。
在.NET中,构造器、获取和设置属性、添加和删除事件、调⽤操作符重载和调⽤转换操作符等等都没有办法返回错误代码,但是在这些构造中⼜需要报告错误,那就必须提供异常处理机制。
在异常的处理中,我们经常使⽤到的三个块分别是:try块;catch块;finally块。
这三个块可以⼀起使⽤,也可以不写catch块使⽤,异常处理块可以嵌套使⽤,具体的⽅法在下⾯会介绍到。
简介“我的软件从来不出错”你能相信吗?我几乎听到你们全部尖叫说我是个说慌者。
“从不出错的软件从某种程度上讲是不可能的!”和普通人的观念相反,创造可信赖的,健壮的软件并不是一件不可能的事情。
请注意,我并没有提及意欲控制核电站的无漏洞软件。
我提到的仅仅是可以在无人看管的服务器或者客户端机器上运行的普通的商业软件,在长时间(几个星期或是几个月)可以无重大故障的工作。
可预测的,我的意思是它拥有低出错率,你可以迅速理解出错原因然后快速搞定它,同是,它从不因为外部错误而毁坏数据。
换句话说,软件是稳定的。
软件中有漏洞是可以原谅的,甚至是被期望的。
不可原谅的是您无法解决一个复发的漏洞,仅仅是因为您没用足够的信息。
为了更好的理解我所说的,我看过不计其数的商业软件,DBMS是这样报告空间不足的错误的:“不能更新用户操作,请与系统管理员联系后在尝试。
”虽然,用这则消息向一个商业用户报告一种未知的资源失败也许是恰当的,通常它应该是可以用来调试错误原因的全部调试信息。
但是,如果没用东西被记入日志,了解当时的状况将会是一件非常费时的事情,通常,程序员会猜测许多可能的原因直到他们找到真正的错误。
在这篇文章中注意到这些,我将会集中精力介绍如何去更好的利用.NET的异常机制:我不会去讨论怎样正确的报告错误信息,因为我认为这个问题应该属于UI(用户界面)领域,同时它十分依赖正在开发的接口和所要面对的听众;一面向青少年的博客文章编辑者应该用一种与直接面向编程人员的socket server完全不同的方式来报告出错信息。
做好最坏的打算几个基础设计概念将会使你的程序更加健壮,同时提高用户处理意外错误的经验。
“提高用户处理意外错误的经验”是什么意思呢?它是用户不会被你提供的令人惊异的对话框吓的发抖。
它更多的是不要使用户误用数据,搞垮计算机,以确保计算机运转的更加安全。
如果你的程序可以无损坏的处理空间不足错误,你将会增加用户的经验。
及早检查强大的类型检查和确认是防止意外异常,确保文档记录及代码检查的有力工具。
【例7-l】使用On Error语句产生Err对象,通过测试Err对象,显示一个“过程调用或参数无效”错误对话框,结果如图8-4所示。
操作步骤:
(1)界面设计:
创建一个Windows应用程序,在窗体上创建一个按钮控件,修改其Text属性为“生成错误”。
(2)双击按钮控件进入代码设计窗口,对其Click事件编写代码如下:
图8-4 错误测试对话框
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
Dim Msg As String
On Error Resume Next
Err.Clear()
Err.Raise(5)
If Err.Number <> 0 Then
Msg = "错误#" & Str(Err.Number) & "发生原因是:" & Err.Source & vbCrLf &
Err.DescriptionMsgBox(Msg, rmation, "Error")
End If
End Sub
提示:
这里的vbCrLf为系统内置常量,表示回车换行。
(3)保存项目,运行应用程序,单击窗体中的“生成错误”按钮,得到如图8-4所示的消息框。
【例7-2】使用非结构化异常处理方法处理被0除错误。
运行结果如图8-5所示的两个消息框。
图8-5 错误测试及处理结果对话框
操作步骤:
1.界面设计:
创建一个Windows应用程序,在窗体上创建一个按钮控件,修改其Text属性为“生成错误”。
2.双击按钮控件进入代码设计窗口,对其Click事件编写代码如下:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
Dim x As Integer, y As Integer, z As Integer
On Error GoTo DivideByZero '启用错误捕捉
x = 5
y = 0
z = x / y
On Error GoTo 0
MsgBox(x & "/" & y & "=" & z, rmation, "结果")
Exit Sub
DivideByZero:
MsgBox("0不可以作除数!", MsgBoxStyle.Exclamation, "错误")
y = 2
Resume '返回发生错误的语句z = x / y End Sub
3.保存项目,运行应用程序,单击窗体中的“生成错误”按钮,得到如图8-5所示的两个对话框。
提示:
这里的DivideByZero是行标签,行标签定义时由冒号结束。
【例7-3】使用Try…Catch…Finally结构,处理被0除错误。
运行结果为如图8-6所示的两个消息框。
(a)(b)
图8-6处理被0除错误,之后退出
操作步骤:
1.界面设计:
创建一个Windows应用程序,在窗体上创建一个按钮控件,修改其Text属性为“生成错误”。
2.双击按钮进入代码设计窗口,对其Click事件编写代码如下:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As Integer = 5
Dim y As Integer = 0
Try
x /= y
Catch ex As Exception When y = 0
MsgBox(ex.Message, rmation, "被0除错误")
Finally
MsgBox("退出Try结构", rmation, "退出")
End Try
End Sub
3.保存项目,运行应用程序,单击窗体中的“生成错误”按钮,得到如图8-6(a)所示的消息框。
4.单击“确定”按钮后,得到如图8-6(b)所示的消息框。
【例7-4】第10章案例分解:
欢迎窗体是整个应用程序的入口,应在其中处理数据库连接问题。
案例中应用结构化异常处理方法处理数据库连接出现错误的问题。
相关部分代码如下:
Public Class Welcome
Private Sub Welcome_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Call connect()
Try
cn.Open()
Catch ex As Data.OleDb.OleDbException
MessageBox.Show(ex.Message & "连接错误,程序将退出!", "数据库连接错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
Application.Exit()
End Try
Dim frmLogin As New FrmLogin
frmLogin.ShowDialog()
End Sub
End Class
【例7-5】测试自己引发的一个异常。
完成功能:使用Throw语句,抛出一个异常,由调用的程序进行处理。
操作步骤:
(1)创建一个Windows应用程序,其自动创建的默认窗体为Form1。
(2)在窗体Form1上创建一个命令按钮控件,然后修改其Text属性为“产生错误”。
(3)在Forml中增加一个私有过程,代码如下:
Private Sub test()
Throw New Exception("我释放了一个异常")
End Sub
(4)对按钮的Click事件编写代码如下:
Try
test()
Catch ex AS Exception
MsgBox(ex.Message,MsgBoxStyle.Information,"测试异常")
End Try
(5)保存项目,运行应用程序,单击窗体中的“产生错误”按钮,得到如图8-7所示的对话框。
图8-7 例8-5的运行结果
【例7-6】测试用户输入的年龄,处理年龄的范围错误。
如果用户输入的不是1到100之间的数值,将抛出异常。
操作步骤:
(1)创建一个Windows应用程序,其自动创建的默认窗体为Form1。
(2)在窗体上建立一个Label,其Text属性为“年龄”,一个TextBox,一个Button,其Text 属性为“测试”。
(3)对按钮的Click事件编写代码如下:
Dim v AS Double
Try
v=Val(TextBoxl.Text)
If v<=0 Or v>100 Then
Throw New Exception("输入的年龄超出范围")
End If
Catch ex As Exception
MsgBox(TextBoxl.Text & vbCrLf &ex.Message,MsgBoxStyle.Question)
TextBoxl.Text=""
TextBoxl.Focus()
End Try
(4)保存项目,运行应用程序。
当在文本框中输入年龄后,单击窗体中的“测试”按钮,当输入的年龄小于等于0或者大于100时,会显示如图8-8所示的对话框。
图8-8 例8-6的运行结果。