C_Sharp 板


LINE

请问关於 C# 防呆 写法要怎样比较妥当? 下面四种方法 Funciton 回传 bool , 最外层再来写错误讯息 或是 string 或 enum 或是自己些个 关於 Error class 代进去 或是 try catch (应该比较不推荐) 写法让我困扰满久的 感谢~ public enum Error { Pass, CantOpenFile, } class Program { static void Main(string[] args) { string filePath = @"C:\123.txt"; //case1 //用 if + bool 来判断是否成功 , if (File.checkFile(filePath)) { Console.WriteLine("档案存在"); } else { Console.WriteLine("档案不存在"); } //case2 // 用 message 丢进去, 再判断是否成功 , 无回传 bool string message = ""; File.checkFile(filePath, ref message); Console.WriteLine(message); //case3 Error error = Error.Pass; File.checkFile(filePath, ref error); Console.WriteLine(error.ToString()); //case4 try { //........ } catch (Exception) { throw; } } } class File { public static bool checkFile(string filePath) { bool result = System.IO.File.Exists(filePath); return result; } public static void checkFile(string filePath, ref string message) { if(System.IO.File.Exists(filePath)) { message = "档案存在"; } else { message = "档案不存在"; } } public static void checkFile(string filePath, ref Error error) { if (System.IO.File.Exists(filePath)) { error = Error.Pass; } else { error = Error.CantOpenFile; } } } --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.73.155.188
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1538637010.A.F0C.html
1F:推 lightyen: 日防夜放家贼难防 用OpenFileDialog 10/04 16:07
2F:推 jass970991: 同意楼上 但如果硬要挑一种写法出来 我会直接丢except 10/04 16:29
3F:→ jass970991: ion 外面接的人要去负责处理 文件写清楚就好 10/04 16:29
我自己来自问自答好了 开档写入只是想举例而已 只是想知道class 里面到底哪一步有问题, 可以传到最外层让UI显示 与同事讨论过後 应该比较像下列 丢出个 Error,再让外面去显示 不知道是否有更好建议 public static class Error { public static int PASS = 0; public static int OPEN_FILE = 1; public static int WRITE_FILE = 2; } class File { string path = @"C:\\"; public static int openAndWriteFile(string path) { if(!File.openFile(path)) return Error.OPEN_FILE; if (!File.writeString("hello")) return Error.WRITE_FILE; return Error.PASS; } public static bool openFile(string File) { return true; } public static bool writeString(string str) { return true; } } ※ 编辑: abc95007 (220.133.187.22), 10/04/2018 23:03:07
4F:推 jass970991: 我经验没有很多 不过我有点好奇 你愿意自己写一个clas 10/04 23:35
5F:→ jass970991: s而不愿意使用exception去接的原因是什麽 try catch 10/04 23:35
6F:→ jass970991: 本身也可以接各种不同的exception 单纯好奇理由 想 10/04 23:35
7F:→ jass970991: 学习各种不同的思维模式 10/04 23:35
也是从别人那边 code 学来的 try 似乎比较像是在无法预期会发生什麽错误 比较难掌控情况下使用 function 丢出个 bool 出来, 再去判断 档案开启失败了, 我就知道 Error 是甚麽 档案写入失败了,我就知道 Error 是甚麽 但我还是不太确定对於防呆哪一种比较好, 同时又让外面 UI 知道到底错在哪里 ※ 编辑: abc95007 (220.133.187.22), 10/05/2018 00:05:46
8F:推 CloudyWing: 一般来说取决於层级,较底层的是例外,较外层是bool o 10/05 02:36
9F:→ CloudyWing: r message 10/05 02:36
10F:→ CloudyWing: 举例来说操作介面来的资料是允许对方可能会输入错误, 10/05 02:41
11F:→ CloudyWing: 就不该用例外处理,而是判断完值後回传讯息,但较底层 10/05 02:41
12F:→ CloudyWing: 的api则是直接预期对方使用这个api应该要知道适当参数 10/05 02:41
13F:→ CloudyWing: 为何,当不符合则是抛出例外。 10/05 02:41
14F:→ CloudyWing: 简单来说还是取决於你对函式的定位,假设你的案例程式 10/05 02:45
15F:→ CloudyWing: 是在Main呼叫函式,我倾向於不用例外 10/05 02:45
16F:推 CloudyWing: 然後讯息方式enum or bool+out message or 写一个资料 10/05 02:50
17F:→ CloudyWing: 结构(structure和class都行)封装是否成功和讯息都可以 10/05 02:50
18F:→ CloudyWing: ,用哪种也是看需求 10/05 02:50
19F:→ CloudyWing: 如果会需要判断回传讯息是哪种而执行不同行为用enum; 10/05 02:55
20F:→ CloudyWing: 想要知道有没有成功并且show讯息用第二种;第三种就比 10/05 02:55
21F:→ CloudyWing: 较弹性,你可以同时封装bool messsge enum,然後看情 10/05 02:55
22F:→ CloudyWing: 况决定 10/05 02:55
23F:→ CloudyWing: 话说你的message应该用out不是ref,用ref会让人预期是 10/05 02:57
24F:→ CloudyWing: 讯息的累加 10/05 02:57
25F:推 DeathTemp: try catch不是用来处理无法预期的错误的,MSDN有说明 10/05 19:57
26F:→ DeathTemp: http://goo.gl/oYodhJ 奇怪不知为何很多人都有原po这种 10/05 19:58
27F:→ DeathTemp: 观念,我还看过有人把每一个function的内容都用try包起 10/05 20:00
28F:→ DeathTemp: 来,每一个喔,更扯的是他的catch里面什麽都没做,等於 10/05 20:00
29F:→ DeathTemp: 出现exception时完全没有讯息,使用者连反映都没机会 10/05 20:01
30F:→ DeathTemp: 如果怀疑自己写的程式可能会有自己无法预期的错误,你 10/05 20:03
31F:→ DeathTemp: 要做的事应该是debug或把错误变成可以预期的,而不是放 10/05 20:04
32F:→ DeathTemp: 着不管,用try包起来就了事 10/05 20:05
33F:→ DeathTemp: 把一支「我不知道他有没有bug,也不知道哪里会有bug」 10/05 20:06
34F:→ DeathTemp: 的程式交出去不觉得怪怪的吗? 10/05 20:06
35F:→ kobe8112: 例外不是都有名称吗...你看官方的各种函式,如果会跳例 10/05 21:36
36F:→ kobe8112: 外,每种不同的例外在什麽情况会跳出来不是都有说明吗? 10/05 21:37
37F:→ kobe8112: 怎麽会不知道Error是什麽呢? 10/05 21:37
38F:→ feeya: log(e.message) 印出来你就知道是哪个exception 10/06 00:27
39F:推 t64141: 很多工程师都把catch地毯式使用,每次看到都觉得很吐血 10/06 00:45
40F:→ t64141: 曾经有同事说: 预防万一,所以每个方法都要try-catch 10/06 00:48
41F:推 CloudyWing: 全包try catch和throw ex真的是try catch两大误用 10/06 00:51
42F:→ t64141: throw ex 也是经典,看过一个专案到处throw ex,然後同事 10/06 00:58
43F:→ t64141: 看到stack trace之後认为是try-catch不够,於是下一层的 10/06 00:58
44F:→ t64141: 方法也都加了try-catch,印完log再重抛出去外面再印一次, 10/06 00:58
45F:→ t64141: 很恐怖XD 10/06 00:58
46F:推 chentsungmin: 建议try catch原则,能处理或需处理才去 catch, 另 10/06 06:16
47F:→ chentsungmin: 外 catch 可以写多段,针对不同型别的exception,这 10/06 06:16
48F:→ chentsungmin: 也可以达到你依不同的 error,丢出不同的exception, 10/06 06:16
49F:→ chentsungmin: 里面可以附加更多不同资讯,而不是一个整数或列举 10/06 06:16
50F:→ chentsungmin: 的限制,它有效能的消耗 10/06 06:16
51F:→ jim7434: try catch 跟 bool 应付的是不同层级的错误处理 10/06 11:05
52F:推 dontblame: try catch 才是好方法,只是要将清楚资讯 丢给呼叫者 10/09 17:04
53F:→ s9041200: 丢出有意义的例外,catch有意义的例外再针对每个case处 11/02 21:54
54F:→ s9041200: 理 11/02 21:54







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP