<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
備忘
問題在這
這種錯誤大多是宣告的類裡面初始欄位賦值出了問題
比如 在類裡面生命了一個 太大的陣列,超出了最大記憶體限制就會出錯
修改下就OK了
在c#中,當出現某個特殊的異常錯誤條件時,就會建立(或丟擲)一個異常物件。這個物件包含有助於跟蹤問 題的資訊。我們可以建立自己的異常類,但.NET提供了許多預定義的異常類,多到這裡不可能 提供詳盡的列表。
列舉幾個常見異常:
StackOverflowException
—如果分配給棧的記憶體區域己滿,就會丟擲這個異常。EndOfStreamException
—這個異常通常是因為讀到檔案末尾而丟擲的。OverflowException
—如果要在checked上下文中把包含值-40的int型別資料強制轉換為uint資料,就會丟擲這個異常。try
塊包含的程式碼組成了程式的正常操作部分,但這部分程式可能遇到某些嚴重的錯誤。catch
塊包含的程式碼處理各種錯誤情況,這些錯誤是執行try塊中的程式碼時遇到的。這個塊還可以用於記 錄錯誤。finally
塊包含的程式碼清理資源或執行通常要在try塊或catch塊末尾執行的其他操作。無論是否丟擲異常,都會執行finally塊,理解這一點非常重要。因為finally塊包含了應總是執行的清理程式碼,如果 在finally塊中放置了return語句,編譯器就會標記一個錯誤。下面的步驟說明了這些塊是如何組合在一起捕獲錯誤情況的:
(1) 執行的程式流進入try塊。
(2) 如果在try塊中沒有錯誤發生,在塊中就會正常執行操作。當程式流到達try塊末尾後,如果存在一個finally塊,程式流就會自動SA finally塊(第(5)步)。但如果在try塊中程式流檢測到一個錯誤,程式流就會跳轉 到catch塊(第⑶步)。
(3) 在catch塊中處理錯誤。
(4) 在catch塊執行完後,如果存在一個finally塊,程式流就會自動進入finally塊:
(5) 執行finally塊(如果存在)。
try { } catch (Exception ex) { } finally { }
異常效能
例外處理具有效能含義。在常見的情況下,不應該使用例外處理錯誤。例如,將字串轉換為數位時,可 以使用int型別的Paree方法。如果傳遞給此方法的字串不能轉換為數位,此方法拋FormatException異常;如果可以轉換一個數位,但它不能放在int型別中,則丟擲OverflowException異常:
static void NumberDemol(string n) { if (n is null) throw new ArgumentNullException(nameof(n)); try { int i = int.Parse(n); Console.WriteLine($"converted: {i}"); } catch (FormatException ex) { Console.WriteLine(ex.Message); } catch (OverflowException ex) { Console.WriteLine(ex.Message); } }
如果NumberDemol方法通常只用於在字串中傳遞數位而接收不到數位是異常的,那麼可以這樣編寫它。 但是,如果在程式流的正常情況下,期望的字串不能轉換時,可以使用TryParse方法。如果字串不能轉換 為數位,此方法不會丟擲異常。相反,如果解析成功,TryParse返回true;如果解析失敗,則返回felse:
static void NumberDemo2(string n) { if (n is null) throw new ArgumentNullException(nameof(n)); if (int.TryParse(n, out int result)) { Console. WriteLine ($"converted {result}"); } else { Console.WriteLine("not a number"); } }
實現多個catch塊
class Program { static void Main() { while (true) { try { string userInput; Console.Write("Input a number between 0 and 5 or just hit return to exit)> "); userInput = Console.ReadLine(); if (string.IsNullOrEmpty(userInput)) { break; } int index = Convert.ToInt32(userInput); if (index < 0 || index > 5) { throw new IndexOutOfRangeException($"You typed in {userInput}"); } Console.WriteLine($"Your number was {index}"); } catch (IndexOutOfRangeException ex) { Console.WriteLine($"Exception: Number should be between 0 and 5. {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"An exception was thrown. Message was: {ex.Message}"); } finally { Console.WriteLine("Thank youn"); } } } }
異常過濾器
自從C# 6開始就支援異常過濾器。catck塊僅在過濾器返回true時執行。捕獲不同的異常型別時,可以有行為不同的catch塊。在某些情況下,catch塊基於異常的內容執行不同的操作。
class Program { static void Main() { try { ThrowWithErrorCode(405); } catch (MyCustomException ex) when (ex.ErrorCode == 405) { Console.WriteLine($"Exception caught with filter {ex.Message} and {ex.ErrorCode}"); } catch (MyCustomException ex) { Console.WriteLine($"Exception caught {ex.Message} and {ex.ErrorCode}"); } Console.ReadLine(); } public static void ThrowWithErrorCode(int code) { throw new MyCustomException("Error in Foo") { ErrorCode = code }; } }
這個範例稱為SolicitColdCall,它包 含兩個巢狀的try塊,說明了如何定義自定義異常類,再從try塊中丟擲另一個異常。
public class ColdCallFileFormatException : Exception { public ColdCallFileFormatException(string message) : base(message) { } public ColdCallFileFormatException(string message, Exception innerException) : base(message, innerException) { } } public class SalesSpyFoundException : Exception { public SalesSpyFoundException(string spyName) : base($"Sales spy found, with name {spyName}") { } public SalesSpyFoundException(string spyName, Exception innerException) : base($"Sales spy found with name {spyName}", innerException) { } } public class UnexpectedException : Exception { public UnexpectedException(string message) : base(message) { } public UnexpectedException(string message, Exception innerException) : base(message, innerException) { } } public class ColdCallFileReader : IDisposable { private FileStream _fs; private StreamReader _sr; private uint _nPeopleToRing; private bool _isDisposed = false; private bool _isOpen = false; public void Open(string fileName) { if (_isDisposed) { throw new ObjectDisposedException("peopleToRing"); } _fs = new FileStream(fileName, FileMode.Open); _sr = new StreamReader(_fs); try { string firstLine = _sr.ReadLine(); _nPeopleToRing = uint.Parse(firstLine); _isOpen = true; } catch (FormatException ex) { throw new ColdCallFileFormatException( $"First line isn't an integer {ex}"); } } public void ProcessNextPerson() { if (_isDisposed) { throw new ObjectDisposedException("peopleToRing"); } if (!_isOpen) { throw new UnexpectedException( "Attempted to access coldcall file that is not open"); } try { string name = _sr.ReadLine(); if (name == null) { throw new ColdCallFileFormatException("Not enough names"); } if (name[0] == 'B') { throw new SalesSpyFoundException(name); } Console.WriteLine(name); } catch (SalesSpyFoundException ex) { Console.WriteLine(ex.Message); } finally { } } public uint NPeopleToRing { get { if (_isDisposed) { throw new ObjectDisposedException("peopleToRing"); } if (!_isOpen) { throw new UnexpectedException( "Attempted to access cold–call file that is not open"); } return _nPeopleToRing; } } public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; _isOpen = false; _fs?.Dispose(); _fs = null; } } class Program { static void Main() { Console.Write("Please type in the name of the file " + "containing the names of the people to be cold called > "); string fileName = Console.ReadLine(); ColdCallFileReaderLoop1(fileName); Console.WriteLine(); ColdCallFileReaderLoop2(fileName); Console.WriteLine(); Console.ReadLine(); } private static void ColdCallFileReaderLoop2(string fileName) { using (var peopleToRing = new ColdCallFileReader()) { try { peopleToRing.Open(fileName); for (int i = 0; i < peopleToRing.NPeopleToRing; i++) { peopleToRing.ProcessNextPerson(); } Console.WriteLine("All callers processed correctly"); } catch (FileNotFoundException) { Console.WriteLine($"The file {fileName} does not exist"); } catch (ColdCallFileFormatException ex) { Console.WriteLine($"The file {fileName} appears to have been corrupted"); Console.WriteLine($"Details of problem are: {ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"Inner exception was: {ex.InnerException.Message}"); } } catch (Exception ex) { Console.WriteLine($"Exception occurred:n{ex.Message}"); } } } public static void ColdCallFileReaderLoop1(string fileName) { var peopleToRing = new ColdCallFileReader(); try { peopleToRing.Open(fileName); for (int i = 0; i < peopleToRing.NPeopleToRing; i++) { peopleToRing.ProcessNextPerson(); } Console.WriteLine("All callers processed correctly"); } catch (FileNotFoundException) { Console.WriteLine($"The file {fileName} does not exist"); } catch (ColdCallFileFormatException ex) { Console.WriteLine($"The file {fileName} appears to have been corrupted"); Console.WriteLine($"Details of problem are: {ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"Inner exception was: {ex.InnerException.Message}"); } } catch (Exception ex) { Console.WriteLine($"Exception occurred:n{ex.Message}"); } finally { peopleToRing.Dispose(); } } }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45