Thử bắt C++

Trong hàng loạt bài từ đầu đến giờ, chúng ta đã trải qua một lần hoàn thiện tất cả chức năng của ứng dụng theo phân tích. Tuy nhiên, trước khi đưa ứng dụng đến người dùng cuối, chúng ta cần bổ sung thêm một số tính năng, vốn không liên quan trực tiếp đến công việc phân tích nghiệp vụ

Chức năng mới này mang tính kỹ thuật hơn là nghiệp vụ, bao gồm bắt và xử lý ngoại lệ (Ngoại lệ, giúp ứng dụng ổn định hơn), sử dụng tệp cấu hình (Xử lý cài đặt, giúp người dùng thay đổi cấu hình của ứng dụng)

ĐỘI DUNG CỦA BẢN DỊCH Ẩn

1. Xử lý ngoại lệ (Xử lý ngoại lệ)

1. 1. Ngoại lệ và chế độ Gỡ lỗi

1. 2. Xử lý ngoại lệ ở chế độ Release

2. Thực hành 1. chức năng bổ sung bắt và xử lý lỗi

2. 1. Bước 1. Điều chỉnh phương thức chính

2. 2. Bước 2. Service and run program with error command

3. Vấn đề cấu hình của ứng dụng

4. Thực hành 2. bổ sung chức năng thiết lập cấu hình

4. 1. Bước 1. Tạo cài đặt tệp

4. 2. Bước 2. Nhập các giá trị vào bảng thông tin cấu hình

4. 3. Bước 3. Create class Config in file source Config. dự án cs trực thuộc

4. 4. Bước 4. Change code of class data access

4. 5. Bước 5. Change code of main method

4. 6. Bước 6. Change code of method ConfigRouter

4. 7. Bước 7. Build thêm lớp ConfigController trong file ConfigController. cs trong thư mục Bộ điều khiển

4. 8. Bước 8. Change the method ConfigRouter

4. 9. Bước 9. Dịch và chạy thử chương trình với các chức năng mới

5. Kết luận

Xử lý ngoại lệ (Xử lý ngoại lệ)

Chúng ta đã nhắc đến khái niệm ngoại lệ (Exception) và xem xét cách thức đơn giản nhất để phát thông báo ngoại lệ bằng lệnh

private static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;
    ConfigRouter();
    while (true)
    {
        ViewHelp.Write("# Request >>> ", ConsoleColor.Green);
        string request = Console.ReadLine();
        try
        {
            Router.Instance.Forward(request);
        }
        catch (Exception e)
        {
            ViewHelp.WriteLine(e.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.WriteLine();
        }
    }
}
3 và lớp
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >      
      <section name="BookMan.ConsoleApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />      
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  
  <userSettings>    
    <BookMan.ConsoleApp.Properties.Settings>
      <setting name="DataAccess" serializeAs="String">
        <value>binary</value>
      </setting>
      <setting name="PromptText" serializeAs="String">
        <value># Command >>></value>
      </setting>
      <setting name="PromptColor" serializeAs="String">
        <value>Green</value>
      </setting>
      <setting name="DataFile" serializeAs="String">
        <value>data.bin</value>
      </setting>
    </BookMan.ConsoleApp.Properties.Settings>    
  </userSettings>
</configuration>
0. Ngoại lệ là một cơ chế rất mạnh trong. NET giúp phát hiện lỗi logic trong chương trình ở giai đoạn Runtime

Ngoại lệ và chế độ Gỡ lỗi

Khi chạy chương trình ở chế độ gỡ lỗi, nếu phát sinh ngoại lệ, Visual Studio sẽ mở tệp mã nguồn ở đúng vị trí lỗi cùng với thông báo cụ thể. Qua đó, chúng ta có thể xác định nguồn gốc của lỗi và đưa ra cách giải quyết

Hình dưới đây minh họa vấn đề sự cố khi người dùng nhập vào một lệnh không tồn tại

Thử bắt C++
Thử bắt C++
Error in debug mode

Đây là chế độ bắt và xử lý lỗi ở chế độ Debug. Chương trình chúng tôi viết từ đầu dự án đến giờ đều dịch và chạy ở chế độ Debug

Xử lý ngoại lệ ở chế độ Release

Một chương trình trước khi phát triển khai thác cho người dùng cuối phải được giao dịch ở chế độ phát hành. Chương trình được dịch ở chế độ này sẽ không chạy được ở chế độ Debug nữa

Nếu chương trình chạy ở chế độ Release mà gặp lỗi, thông báo lỗi sẽ được hiển thị như dưới đây

Thử bắt C++
Thử bắt C++

Đây là chế độ bắt và xử lý lỗi mặc định của. NET framework đối với bảng điều khiển ứng dụng

Như chúng ta thấy, chế độ bắt và xử lý lỗi mặc định của. NET framework tương đối không thân thiện với người dùng

NET cũng cung cấp cho các chương trình tính năng bắt và xử lý ngoại lệ (Xử lý ngoại lệ) để tự xác định hoạt động của chương trình khi xảy ra lỗi (ngoại lệ), tránh phải sử dụng cơ chế bắt và xử lý lỗi

Thực hiện hành động 1. chức năng bổ sung bắt và xử lý lỗi

Bước 1. Điều chỉnh phương thức chính

private static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;
    ConfigRouter();
    while (true)
    {
        ViewHelp.Write("# Request >>> ", ConsoleColor.Green);
        string request = Console.ReadLine();
        try
        {
            Router.Instance.Forward(request);
        }
        catch (Exception e)
        {
            ViewHelp.WriteLine(e.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.WriteLine();
        }
    }
}

Khối

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >      
      <section name="BookMan.ConsoleApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />      
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  
  <userSettings>    
    <BookMan.ConsoleApp.Properties.Settings>
      <setting name="DataAccess" serializeAs="String">
        <value>binary</value>
      </setting>
      <setting name="PromptText" serializeAs="String">
        <value># Command >>></value>
      </setting>
      <setting name="PromptColor" serializeAs="String">
        <value>Green</value>
      </setting>
      <setting name="DataFile" serializeAs="String">
        <value>data.bin</value>
      </setting>
    </BookMan.ConsoleApp.Properties.Settings>    
  </userSettings>
</configuration>
1 được đặt để kiểm soát “cửa ngõ” của chương trình. lời gọi phương thức Chuyển tiếp. This method call is started of any activity of any application when user input truy vấn

Khối

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >      
      <section name="BookMan.ConsoleApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />      
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  
  <userSettings>    
    <BookMan.ConsoleApp.Properties.Settings>
      <setting name="DataAccess" serializeAs="String">
        <value>binary</value>
      </setting>
      <setting name="PromptText" serializeAs="String">
        <value># Command >>></value>
      </setting>
      <setting name="PromptColor" serializeAs="String">
        <value>Green</value>
      </setting>
      <setting name="DataFile" serializeAs="String">
        <value>data.bin</value>
      </setting>
    </BookMan.ConsoleApp.Properties.Settings>    
  </userSettings>
</configuration>
2 được viết để bắt tất cả các loại lỗi (vì bắt lỗi thuộc loại ngoại lệ) và đưa vào biến e. Thông báo lỗi cụ thể có thể truy xuất thông qua thuộc tính Thông báo của đối tượng Ngoại lệ và viết ra màu đỏ mới

Trong bất kỳ vấn đề nào (dù thực hiện lệnh Chuyển tiếp có lỗi hay không) sẽ luôn bổ sung một dòng trống sau khi thực hiện (khối

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >      
      <section name="BookMan.ConsoleApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />      
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  
  <userSettings>    
    <BookMan.ConsoleApp.Properties.Settings>
      <setting name="DataAccess" serializeAs="String">
        <value>binary</value>
      </setting>
      <setting name="PromptText" serializeAs="String">
        <value># Command >>></value>
      </setting>
      <setting name="PromptColor" serializeAs="String">
        <value>Green</value>
      </setting>
      <setting name="DataFile" serializeAs="String">
        <value>data.bin</value>
      </setting>
    </BookMan.ConsoleApp.Properties.Settings>    
  </userSettings>
</configuration>
3)

Bước 2. Service and run program with error command

Thử bắt C++
Thử bắt C++
Run program with error command

Chúng ta có thể thấy chế độ bắt lỗi mặc định của. NET đã không còn kích hoạt nữa. Thay vào đó, chế độ bắt lỗi riêng của chương trình đã hoạt động. Các thông báo cũng đơn giản nhẹ nhàng hơn. Có những thông báo xuất phát từ lỗi do chúng ta tự phát ra, cũng có một số lỗi được phát ra từ các phương thức chuẩn của. MẠNG LƯỚI

Chúng ta cũng xin lưu ý rằng, dù chạy ở chế độ nào (Debug hay Release), cơ chế bắt lỗi riêng cũng đều hoạt động. Điều này cũng có nghĩa là chúng tôi đã loại bỏ ưu tiên của chế độ Debug. không xác định được vị trí gây ra lỗi, cũng không theo dõi được ngăn xếp khi bị lỗi. Việc bắt lỗi như vậy không thích hợp ở giai đoạn phát triển ứng dụng. Cũng vì lý do này mà nội dung bắt và xử lý lỗi của chúng ta xem xét ở bài cuối cùng của dự án

Cấu hình vấn đề của ứng dụng

Khi một chương trình đã được dịch, đóng gói và khai thác cho người dùng cuối, chúng ta không thể dễ dàng thay đổi nó được nữa vì liên quan đến nhiều khâu. Ví dụ, nếu chúng ta quyết định sử dụng file nhị phân để lưu trữ dữ liệu của chương trình thì sau khi phát triển khai thác, nếu muốn chuyển sang sử dụng file json, chúng ta lại phải thực hiện Trọn vẹn mã nguồn đã sửa đổi =>

Trong nhiều tình huống, chúng tôi đã dự kiến ​​sẵn những thay đổi cho chương trình mà người dùng đầu cuối có thể thực hiện được. Ví dụ, chúng tôi muốn cho phép người dùng cuối thay đổi màu sắc và văn bản của con trỏ lệnh. Chúng ta cũng muốn cho người dùng cuối lựa chọn loại tệp dữ liệu để lưu trữ (tệp nhị phân, xml hay json)

Một vấn đề khác đó là thiết lập của ứng dụng trong giai đoạn phát triển không thể sử dụng trong giai đoạn phát triển khai thác. Ví dụ kết nối cơ sở dữ liệu ở giai đoạn phát triển ứng dụng hoàn toàn khác với kết nối ở giai đoạn phát triển khai thác. Khi đó, thông báo về chuỗi kết nối không thể mã thẳng trong ứng dụng mà phải đặt ở tệp cấu hình để khi cài đặt chương trình người dùng sẽ trực tiếp thay đổi

Rất nhiều vấn đề tương tự dẫn đến nhu cầu lưu trữ và truy xuất thông tin cấu hình cho chương trình

Trong phần thực thi này, chúng ta sẽ áp dụng cơ chế lưu trữ và truy xuất thông tin cấu hình của. NET để xây dựng cấu hình tính năng. Tính năng này cho phép người dùng cuối cùng thực hiện các thao tác sau

  • Thay đổi màu sắc và văn bản của dấu nhắc lệnh. Hiện tại chúng ta đang thiết lập phần cứng văn bản của lệnh được nhắc đến là “# Yêu cầu >>>” với màu Xanh lục. Chúng ta muốn người dùng có thể tùy chọn văn bản và màu sắc của dấu nhắc lệnh
  • Thay đổi chế độ và nơi lưu trữ dữ liệu. Hiện tại chúng ta đã xây dựng ba cơ chế lưu trữ dữ liệu khác nhau. nhị phân, json, xml. Các cơ chế này lưu dữ liệu vào tệp tương ứng là dữ liệu. thùng, dữ liệu. json, dữ liệu. xml. Chúng ta muốn người dùng có thể tùy chọn cơ chế lưu trữ và tệp dữ liệu

Thực hiện hành động 2. bổ sung chức năng thiết lập cấu hình

Bước 1. Tạo cài đặt tệp

Nhấp đúp vào nút Thuộc tính của BookMan. ConsoleApp. Trong cửa sổ chọn mục Cài đặt

Thử bắt C++
Thử bắt C++

Do dự án này chưa có bất kỳ cài đặt tệp nào nên phần nội dung bên tay phải trống. Nhấp vào đường liên kết sẽ tạo ra tệp cài đặt đầu tiên của dự án. Mặc định tập tin này có tên là Settings. settings và nằm trong nút Properties

Thử bắt C++
Thử bắt C++

Visual Studio tạo ra một giao diện đồ họa để nhập các thiết lập (setting). Cũng có thể mở giao diện này bằng cách nhấp đúp vào nút Cài đặt. cài đặt

Bước 2. Nhập các giá trị vào bảng thông tin cấu hình

Thử bắt C++
Thử bắt C++
Nhập giá trị cho cài đặt bảng

Đây là bảng thông tin đặc biệt, trong đó dữ liệu từ bảng sẽ được Visual Studio sử dụng để tự động sinh ra một lớp hỗ trợ truy xuất thông tin cấu hình. Lớp này có tên là Cài đặt nằm trong không gian tên con Thuộc tính. Như trong dự án này, tên đầy đủ của Layer Settings là BookMan. ConsoleApp. Đặc tính. Cài đặt. Ở tất cả các mã nguồn tệp của dự án, chúng tôi đều có thể sử dụng Cài đặt lớp này

Mỗi cài đặt chứa 4 thông tin

Tên. tên của cài đặt. Tên thông báo sẽ được sử dụng để tạo ra một thuộc tính tương ứng của lớp Cài đặt. Cài đặt là một lớp được Visual Studio sinh ra tự động dựa trên cơ sở dữ liệu của bảng này, trong đó mỗi cài đặt sẽ là một thuộc tính của lớp. Vì vậy, Tên phải tuân thủ theo quy tắc đặt tên biến và quy định đặt tên thuộc tính mà chúng ta đã học

Loại hình. data type of setting. Như trên đã nói, mỗi cài đặt sẽ trở thành một thuộc tính của lớp Cài đặt, giá trị của Loại sẽ là kiểu dữ liệu của thuộc tính

Lưu ý với việc thiết lập PromptColor, kiểu dữ liệu Hệ thống. ConsoleColor normal sẽ không xuất hiện trong danh sách lựa chọn. Chúng ta cần tự mình định vị chỉ các kiểu này. In combo box of the Type select Browse; . Khi đó, trong ô Value sẽ có thể mở combobox để lựa chọn một trong 16 màu của ConsoleColor

Thử bắt C++
Thử bắt C++

Giá trị. default value of setting. Giá trị này cũng tương đương với giá trị gán ban đầu cho mỗi thuộc tính. Mặc dù trong ô nhập dữ liệu, chúng tôi chỉ nhập một chuỗi ký tự, giá trị này thực sự được chuyển đổi về kiểu tương ứng của thuộc tính. Vì lý do này, chỉ những kiểu có khả năng tuần tự hóa (tuần tự hóa) về xml mới có thể được sử dụng

Phạm vi. quyết định phạm vi sử dụng của cài đặt. Phạm vi có thể nhận một trong hai giá trị. Người dùng hoặc Ứng dụng

Phạm vi ứng dụng quyết định rằng đây là một thuộc tính chỉ đọc (read-only). Chúng ta không thể thay đổi giá trị của cài đặt trong khi chương trình đang hoạt động. Phạm vi này sử dụng đối với các cài đặt cấu hình một lần khi triển khai hệ thống và sau đó không (hoặc hiếm khi) thay đổi nữa

Người dùng đối phó với việc sử dụng những cài đặt cần thay đổi, ngay cả khi chương trình đang hoạt động (và có hiệu lực ngay lập tức). In this project we set all 4 setting in user scope

Khi lưu bảng cấu hình lại, Visual Studio sẽ tự động lưu thông tin vào tệp Ứng dụng. config as after

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >      
      <section name="BookMan.ConsoleApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />      
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  
  <userSettings>    
    <BookMan.ConsoleApp.Properties.Settings>
      <setting name="DataAccess" serializeAs="String">
        <value>binary</value>
      </setting>
      <setting name="PromptText" serializeAs="String">
        <value># Command >>></value>
      </setting>
      <setting name="PromptColor" serializeAs="String">
        <value>Green</value>
      </setting>
      <setting name="DataFile" serializeAs="String">
        <value>data.bin</value>
      </setting>
    </BookMan.ConsoleApp.Properties.Settings>    
  </userSettings>
</configuration>

Khi dịch ra ứng dụng, nội dung của tệp Ứng dụng. config sẽ được sao chép vào một tệp được đặt tên theo tên ứng dụng với phần mở rộng. cấu hình. Đối với ứng dụng này, tệp cấu hình khi khai thác là BookMan. ConsoleApp. người cũ. cấu hình

Song song with save data into file App. config, Visual Studio cũng tự sinh ra mã cho lớp Cài đặt

Thử bắt C++
Thử bắt C++

Không nên thay đổi nội dung của tệp này vì nếu như dữ liệu thay đổi, Visual Studio sẽ tự động sinh lại mã cho lớp này. Khi đó những thay đổi của người dùng sẽ bị mất. Vì đây là một phần lớp, nếu thực sự muốn bổ sung mã có thể tạo thêm tệp mã nguồn nữa để ghép nối với lớp này

Bước 3. Create class Config in file source Config. dự án cs trực thuộc

using System;
namespace BookMan.ConsoleApp
{
    using DataServices;
    internal class Config
    {
        private static Config _instance;
        public static Config Instance = _instance ?? (_instance = new Config());
        private Config() { }
        private Properties.Settings _s = Properties.Settings.Default;
        public void Reload() => _s.Reload();
        public IDataAccess IDataAccess
        {
            get {
                var da = _s.DataAccess;
                switch (da.ToLower())
                {
                    case "binary": return new BinaryDataAccess();
                    case "json": return new JsonDataAccess();
                    case "xml": return new XmlDataAccess();
                    default: return new BinaryDataAccess();
                }
            }
        }
        public string DataAccess
        {
            get => _s.DataAccess;
            set {
                _s.DataAccess = value;
                _s.Save();
            }
        }
        public string PromptText
        {
            get => _s.PromptText;
            set {
                _s.PromptText = value;
                _s.Save();
            }
        }
        public ConsoleColor PromptColor
        {
            get => _s.PromptColor;
            set {
                _s.PromptColor = value;
                _s.Save();
            }
        }
        public string DataFile
        {
            get => _s.DataFile;
            set {
                _s.DataFile = value;
                _s.Save();
            }
        }
    }
}

Bước 4. Change code of class data access

// lớp BinaryDataAccess
public class BinaryDataAccess : IDataAccess
{
    public List<Book> Books { get; set; } = new List<Book>();
    private readonly string _file = Config.Instance.DataFile; // "data.dat";
...
// lớp JsonDataAccess
public class JsonDataAccess : IDataAccess
{
    public List<Book> Books { get; set; } = new List<Book>();
    private readonly string _file = Config.Instance.DataFile; // "data.json";
...
// lớp XmlDataAccess
public class XmlDataAccess : IDataAccess
{
    public List<Book> Books { get; set; } = new List<Book>();
    private readonly string _file = Config.Instance.DataFile; // "data.xml";
...

Bước 5. Change code of main method

________số 8

Bước 6. Change code of method ConfigRouter

private static void ConfigRouter()
{
    IDataAccess context = Config.Instance.IDataAccess; //new BinaryDataAccess();
    BookController controller = new BookController(context);
    ShellController shell = new ShellController(context);
...

Bước 7. Build thêm lớp ConfigController trong file ConfigController. cs trong thư mục Controllers

private static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;
    ConfigRouter();
    while (true)
    {
        ViewHelp.Write("# Request >>> ", ConsoleColor.Green);
        string request = Console.ReadLine();
        try
        {
            Router.Instance.Forward(request);
        }
        catch (Exception e)
        {
            ViewHelp.WriteLine(e.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.WriteLine();
        }
    }
}
0

Bước 8. Change method ConfigRouter

Bổ sung khai báo đối tượng của kiểu ConfigController

private static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;
    ConfigRouter();
    while (true)
    {
        ViewHelp.Write("# Request >>> ", ConsoleColor.Green);
        string request = Console.ReadLine();
        try
        {
            Router.Instance.Forward(request);
        }
        catch (Exception e)
        {
            ViewHelp.WriteLine(e.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.WriteLine();
        }
    }
}
1

Bổ sung thêm các route sau

private static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;
    ConfigRouter();
    while (true)
    {
        ViewHelp.Write("# Request >>> ", ConsoleColor.Green);
        string request = Console.ReadLine();
        try
        {
            Router.Instance.Forward(request);
        }
        catch (Exception e)
        {
            ViewHelp.WriteLine(e.Message, ConsoleColor.Red);
        }
        finally
        {
            Console.WriteLine();
        }
    }
}
2

Bước 9. Dịch và chạy thử chương trình với các chức năng mới

Thử bắt C++
Thử bắt C++
Chạy chức năng cấu hình

Sau khi thực hiện các lệnh trên, hãy đóng và chạy lại chương trình để thấy các thiết lập mới có hiệu lực

Như vậy, chúng tôi đã cung cấp khả năng cuối cùng cho người dùng để thay đổi cấu hình cơ bản. color and text of the command command;

Thử bắt C++
Thử bắt C++

Kết luận

Trong bài học này, chúng tôi đã xem xét hai vấn đề. Ngoại lệ và Cài đặt. Đây là những kỹ thuật bổ sung giúp ứng dụng hoạt động ổn định và chuyển đổi nhẹ nhàng hơn. Chúng ta cũng đã vận dụng hai kỹ thuật này vào ứng dụng

Trong bài tiếp theo và là bài học cuối cùng của chuỗi bài giảng này, chúng ta sẽ học cách phát triển ứng dụng