台灣最大程式設計社群網站
線上人數
1373
 
會員總數:244132
討論主題:188493
歡迎您免費加入會員
討論區列表 >> VB.NET >> 被呼叫的函式不能有Try Catch,也不能除錯?
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
被呼叫的函式不能有Try Catch,也不能除錯?
價值 : 150 QP  點閱數:281 回應數:18

樓主

city
初學者
130 40
1347 222
發送站內信

各位前輩大大們好:

我知道這樣說很荒謬 但是...

先來個程式碼:

(若下面內容有任何錯誤 歡迎各位大大們指正)

===========================================================================================
[一]



以上:
Form1的Button1_Click呼叫了Class1的Divide方法
但是Class1的Divide方法會出現錯誤
程式就卡住了

===========================================================================================
[二]

為了解決問題 在Class1裡面加上Try Catch
如下:


以上:
Class1的Divide方法捕捉到了錯誤 但是卻無法通知Form1 並由Form1來處理錯誤出現後該怎麼做

===========================================================================================
[三]

如果Form1 Class1都加上Try Catch
如下:


以上:
Class1捕捉到了錯誤
卻無法通知Form1
也無法由Form1的Try Catch來決定出現錯誤後該怎麼處理
也無法關閉Form1的Button1_Click方法

===========================================================================================
[四]

Form1加上Try Catch
Class1不加Try Catch
如下:


以上:
Class1沒有Try Catch
Form1有Try Catch

Form1捕捉到了Class1的錯誤 並且可以自由的決定該怎麼做

所以:Class1不該有Try Catch?

===========================================================================================
[五]

以上是Try Catch的範例 以下是Class除錯的範例:


如上:
Class1的方法會對參數進行除錯
Class1偵測到錯誤的參數 可以進行部分的錯誤處理 例如:
1.出現錯誤訊息
2.出現錯誤訊息,由使用者決定是否忽略錯誤繼續執行或結束程式
3.結束Class的SetFormTitle方法
4.結束程式

可是Class1卻無法通知Form1出現錯誤了 並由Form1來處理發生錯誤時該怎麼做
Class1也不能關閉Form1的Button1_Click方法 使它不要進行後續的程式碼

就算Form1加上了Try Catch也是無法捕捉Class1的錯誤

===========================================================================================
[六]

如果Class1不對參數進行除錯
Form1加上Try Catch捕捉錯誤
如下:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Class1.SetFormTitle(Nothing, Nothing)
Catch ex As Exception
'捕捉到了Class1的錯誤 並且可以自由的決定該怎麼做
End Try

MessageBox.Show(Me.Text)
End Sub
End Class


Public Class Class1
Public Shared Sub SetFormTitle(ByRef f As Form, ByVal s As String)
f.Text = s
End Sub
End Class
</pre>

以上:
Class1並不進行參數除錯
而Form1順利的捕捉到Class1的錯誤 並且可以自由的決定該怎麼做

所以:Class1不該除錯?

===========================================================================================

不知道各位大大們能否了解以上我所說的?

在Class1裡面 如果有Try Catch 或是自訂的除錯機制
發生錯誤後 只能做出部分的處理 例如:
1.出現錯誤訊息
2.出現錯誤訊息,由使用者決定是否忽略錯誤繼續執行或結束程式
3.結束Class1裡面的方法
4.結束程式

如果要完整且自由的決定:發生錯誤時該如何處理
只能將Try Catch寫在Form1裡面

如果Form1有Try Catch
而Class1有Try Catch或是自訂的除錯機制
將會搶先攔截到錯誤訊息 而無法將錯誤訊息傳回給Form1

也就是說:
Class1要故意不寫Try Catch 要故意不寫自訂的除錯機制 這樣才能將錯誤訊息傳回給Form1?

因此:
Class1不能有Try Catch? 也不能有自訂的除錯機制?

各位大大們怎麼看呢?
各位大大們又該是如何做的呢?

謝謝~~

搜尋相關Tags的文章: [ 被呼叫 ] , [ 函式 ] , [ 不能 ] , [ Try Catch ] , [ 除錯 ] ,
本篇文章發表於2019-01-12 10:03
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

P陳
檢舉此回應
有三個辦法
1.用 共用變數
2.用 Property
3.用 委派

以2最簡單

本篇文章回覆於2019-01-12 10:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

city
檢舉此回應
更正:

[五]
Class1的SetFormTitle方法
裡面沒有Exit Sub

本篇文章回覆於2019-01-12 10:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

P陳
檢舉此回應
還有第4種方法 (這應是最直接的方法了)
您應該看得懂


本篇文章回覆於2019-01-12 10:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

city
檢舉此回應
我目前寫程式的方法類似這樣:



後來[誰是誰]大大有說道:如果程式出現錯誤就關閉 會被使用者罵翻
這或許不是[誰是誰]大大的原意
但我突然想到 我原本把全部的程式碼都塞進TryCatch似乎有些問題
問題大約是:
只要程式碼出現問題 就會進行"統一"的處理方式(因為只有一個TryCatch) 而不是分別的針對不同TryCatch進行不同的處理

=======================================================================================================

另外:
我的另一個發問[各位會在方法裡面除錯嗎?]
https://www.blueshop.com.tw/board/FUM20050124191756KKC/BRD201812111756122GF.html

其中5樓[浩瀚星空]大大有說到:
驗証機制(除錯)該寫在Form1裡面 而不是Class1方法裡面
其實那時我有點不以為意
想說:如果Class1方法裡面都沒有除錯 那不就是完全沒有保護能力的Class?
任何人都能輕易的亂搞Class?

可是現在看來:如果Class1有除錯機制 似乎會搶了Form1捕捉錯誤的優先權?
當然 我也不確定這是否[浩瀚星空]大大的原意?
本篇文章回覆於2019-01-12 10:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
在class1裡面捕捉exception, 就是為了在class1裡面自行處理呀!!
捕捉到了, 然後又不想處理?? 那就不要捕捉呀...全部丟給Form1呀, 沒有問題呀

如果是要自行定義錯誤,
就是Throw一個Exception呀,

例如, 在class1內, 直接丟exception出去, 這樣子寫Form1的人自然就得去處理





本篇文章回覆於2019-01-12 10:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

city
檢舉此回應
修正4樓的程式碼:

本篇文章回覆於2019-01-12 10:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
底下的2個函數的運作模式, 你可以去思考一下

【Int32.TryParse】vs【Int32.Parse】
https://docs.microsoft.com/zh-tw/dotnet/api/system.int32.tryparse?view=netframework-4.7.2
https://docs.microsoft.com/zh-tw/dotnet/api/system.int32.parse?view=netframework-4.7.2


TryParse是回傳【true/false】以及【轉換後的值】
如果失敗就給你一個false, 不會給你Exception
當使用者輸入文字時, 你會得到false, 然後在form1做相對應的提示


而Parse是直接轉換, 回傳轉換後的值
如果失敗就給你一個Exception
當使用者輸入文字時, 你沒寫try catch的話就會程式錯誤...
你有在form1寫 try catch來捕捉的話, 就是在form1做相對應的提示
本篇文章回覆於2019-01-12 11:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

city
檢舉此回應
To:P陳

1樓的部分可以提供簡單示範嗎?
謝謝~~
本篇文章回覆於2019-01-12 11:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

city
檢舉此回應
To:小羊窒息[5樓]

沒想到Throw可以單獨使用

一直以為Throw要包在TryCatch裡面才能使用...
本篇文章回覆於2019-01-12 11:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

city
檢舉此回應
To:小羊窒息[7樓]

字串轉數字我一般用:
CInt
System.Convert.ToInt32

例如:
MessageBox.Show(CInt("500"))
MessageBox.Show(System.Convert.ToInt32("500"))


剛剛試了一下Parse TryParse
[Parse]
MessageBox.Show(System.Int32.Parse("500"))

[TryParse]
Dim a As Integer = Nothing
System.Int32.TryParse("500", a)
MessageBox.Show(a)

好像也是可行

只不過我不了解大大提出Parse TryParse的用意為何?
Parse TryParse與Try Catch又有何關聯?
可否請大大說明或簡單示範呢?

謝謝~~
本篇文章回覆於2019-01-12 12:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
把"500" 改成TextBox1.Text會比較符合使用者輸入錯誤的情境

(畢竟try catch就是要針對例外狀況進行處理的, 例如使用者輸入【壹仟捌佰】,
想要直接轉換成1800是鐵定發生錯誤的)






本篇文章回覆於2019-01-12 12:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

city
檢舉此回應
To:小羊窒息[11樓]

原來Parse TryParse可以這樣用
一直以為Parse TryParse只是單純的將字串轉換成數字的函式而已...
本篇文章回覆於2019-01-12 12:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

P陳
檢舉此回應
因為不知您的需求,我提的4種模式,各有不同的配合。

1F的作法 後來我在 4F 給您一個我認為最簡單的解法範例。
當 / 0 時,會回傳文字 否則就回傳 3/10 =0.3
主程式中再比對是否為數字 isnumeric(),是數字就往下走,不是的話就作處理。
本篇文章回覆於2019-01-12 13:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

city
檢舉此回應
感謝[P陳]大大 及[小羊窒息]大大 兩位前輩提供的方法

祝周末愉快 :)
本篇文章回覆於2019-01-12 14:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

誰是誰
檢舉此回應
問題出在場景,一個方法要決定怎麼處理例外情況是依據應用場景決定的。

簡單的例子:
一個直接與使用者介面互動的方法,基本上不會將 exception 直接拋出去 (不處理就是一種直接拋出去的方式),因為這樣會影響使用者的操作,所以要攔截例外,並且加以處理 (提示使用者、紀錄 exception 等等都是)。

然而,場景若是轉換為類別庫專案,那就是另外一回事,通常會把例外往外拋, 讓呼叫此方法的 caller 決定如何處理。

前面的例子,只是一小部分場景描述範例,實際的應用場景變化太多了。


本篇文章回覆於2019-01-12 18:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.