异常处理的 catch 语句中,什么情况下需要 messagebox.show 出错误信息,何时要再次抛出异常呢?
------------------------------------------------------
我看到有些异常处理中,在catch语句中,直接显示 e.message,即告诉用户哪出问题了,然后return返回,
但是有些代码中,却是再次抛出新的异常。我不知这是为什么,在哪种情况下需要再次抛出异常呢?
------------------------------------------------------
我看到有些异常处理中,在catch语句中,直接显示 e.message,即告诉用户哪出问题了,然后return返回,
但是有些代码中,却是再次抛出新的异常。我不知这是为什么,在哪种情况下需要再次抛出异常呢?
比如你认为这个异常的发生是不应该的,那你可以直接throw;抛给调用方处理,如果这个异常是内部的,外面根本不关心其意义,可以隐藏掉,用别的方式处理,或是提示用户。
DataAccess层不得向上层隐藏任何异常
要明确区分业务执行的结果和系统异常。比如验证用户的合法性,如果对应的用户ID不存在,不应该抛出异常,
而是返回(或通过out参数)一个表示验证结果的枚举值,这属于业务执行的结果。但是,如果在从数据库中提取用户信息时,数据库连接突然断开,则应该抛出系统异常
BL层应根据业务的需要捕获某些系统异常,并将其转化为业务执行的结果
UI层除了从调用BL层的API获取的返回值来查看业务的执行结果外,还需要截获所有的系统异常,并将其解释为友好的错误信息呈现给用户
每层都可抛出
至于输出,本人不赞同用MessageBox.show。。
我建议用Console.writeLine 另外,我还是学生。回答不好请谅解
还是:真正有能力debug的人直接抛出异常(在call stack窗口去调试)。
我不愿意多说,因为架构设计是没有办法向完全没有经验的初学者说明白的。不明白What就没法理解Why,没有理解Why去了解How也是没有意义的。
我说MessagwBox.Show恶劣,初学者说,哦,那就用Console.Write。再说Console.Write不好,那就用Response.Write?
sp1234说一个客户端应用程序应该只有一个地方捕获并且处理异常。
好了,有人看到利用异常陷阱完成一些特定的代码又不解了。学生一开始打好基础。把当下的东西学好,而不是去学一些貌似高深的东西,搞得一知半解。
比如连接服务器失败,应该提示用户,连接服务器失败,请检查原因,是不是网络不通呀?
这时如果再抛出异常,客户的程序就挂了呀。
所以我认为,在深层次可以抛出异常,但是在主调函数中,必须给出提示。异常就是程序中不能处理的地方,你在顶层不提示用户,还能做什么呢?----------------------------------
看过QQ报错么?异常的时候弹出对话框,提示用户发送异常信息?重启?
如果你的软件不确定联网,你有了异常,应当记录到一个异常日志,如果异常严重导致错误,要求用户发回日志,以便开发人员快速定位问题。提示给用户的自然和异常无关,比如:很抱歉软件出错,请保留软件不要卸载联系xxx。这样开发人员联系到客户后有机会找到错误,我个人认为,发布版本的软件如果小公司无法进行完善的测试,有些不容易复现的问题,你需要记录异常信息,在用户出错时反馈完善。
举个例子吧。
比如一个 c/s 客户端程序,启动时,网络是好的,正常连接到了服务器 sql server 2000.
然后运行,可是有可能交换机断电了,这台客户机就与服务器失去连接了。这是客户端程序执行一个 select 查询。
大家说这个异常处理应该以什么方式体现呢?1.用messagebox.show("客户机与服务器失去连接,请检查网络连接是否正常!","提示");2.记录信息到日志,我认为,messagebox.show是必须的呀,因为如果不显示,操作员根本不知道为什么操作失败了,是吧。
至于是不是记录到日志,有必要吗?其实给出提示,用户会检查连接,发现交换断电了,接上就行了。然后重启程序继续工作。大家认为我的方法合理吗?如果不合理,用什么方式好呢?
如果你的组件被重用到Console程序、Web程序、系统服务、WPF、WCF或者别的什么地方。
如果界面设计者希望用一个自定义的消息框代替MessageBox,或者希望实现静默的用户界面。那么这样的设计就麻烦了。
更加重要的是,如果希望把你的代码放入WorkThread,而不是UI Thread,这样写可能造成程序的死锁。
避免try catch,是绕个弯,再向前走!