開發 SDK 時,藉由拋出自定義異常,來通知使用者用錯SDK了

假設今天使用者調用了一個SDK中未被實現的方法,卻沒有拋出異常,如果錯誤在DLL中,會導致不知道錯誤的地方在哪裡。

所以開發 SDK 時,在子類實現虛方法的過程中,沒有實現的方法被調用時,需要拋出異常。

在開發 SDK 時,為了確保當使用者使用未實現的抽象基類方法時能夠拋出有意義的異常來提醒開發者,可以使用自定義異常來實現這一點。

舉個例子,假設今天 賽車 SDK 錯誤用於射擊遊戲。

假設我們有一個抽象基類 SDKBase,其中包含一個虛擬方法 TriggerGun。對於射擊遊戲 SDK,需要實現這個方法,而賽車遊戲 SDK 不需要實現這個方法,並且應該在不小心調用這個方法時拋出異常。

定義自定義異常類別

using System;

namespace YourNamespace
{
    public class FunctionNotImplementedException : Exception
    {
        public FunctionNotImplementedException() : base() { }

        public FunctionNotImplementedException(string message) : base(message) { }

        public FunctionNotImplementedException(string message, Exception innerException) : base(message, innerException) { }
    }
}

定義抽象基類

namespace YourNamespace
{
    public abstract class SDKBase
    {
        public virtual void Initialize()
        {
            // 默認實現或抽象方法
        }

        public virtual void StartGame()
        {
            // 默認實現或抽象方法
        }

        public virtual void EndGame()
        {
            // 默認實現或抽象方法
        }

        public virtual void TriggerGun()
        {
            throw new FunctionNotImplementedException("TriggerGun method is not implemented in this SDK.");
        }

        // 添加其他需要的方法...
    }
}

實現具體的 SDK

對於射擊遊戲 SDK,需要實現 TriggerGun 方法:

namespace YourNamespace
{
    public class ShootingGameSDK : SDKBase
    {
        public override void Initialize()
        {
            // 具體的實現...
        }

        public override void StartGame()
        {
            // 具體的實現...
        }

        public override void EndGame()
        {
            // 具體的實現...
        }

        public override void TriggerGun()
        {
            // 射擊遊戲的具體實現
        }
    }
}

對於賽車遊戲 SDK,不需要實現 TriggerGun 方法,但仍需提供其他必要的方法實現:

namespace YourNamespace
{
    public class RacingGameSDK : SDKBase
    {
        public override void Initialize()
        {
            // 具體的實現...
        }

        public override void StartGame()
        {
            // 具體的實現...
        }

        public override void EndGame()
        {
            // 具體的實現...
        }

        // 不需要實現 TriggerGun,使用基類的默認行為,即拋出異常
    }
}

使用 SDK

在使用這些 SDK 時,如果開發者不小心使用了錯誤的 SDK 類型,並且該類型未實現某些方法,將會拋出 FunctionNotImplementedException,提示開發者這個方法未被實現。

using YourNamespace;

public class Game
{
    public void Run()
    {
        SDKBase sdk;

        // 模擬錯誤地使用賽車遊戲 SDK 來進行射擊遊戲的操作
        sdk = new RacingGameSDK();

        try
        {
            sdk.Initialize();
            sdk.StartGame();
            sdk.TriggerGun(); // 這將拋出 FunctionNotImplementedException
        }
        catch (FunctionNotImplementedException ex)
        {
            Console.WriteLine(ex.Message);
            // 處理異常,例如記錄日誌或顯示錯誤信息
        }
    }
}

總結

通過這樣的設計,可以確保在開發和使用 SDK 的過程中,如果不小心使用了未實現特定功能的方法,能夠拋出有意義的異常,提示開發者這個方法未被實現,從而及時發現並解決問題。這樣不僅提高了代碼的健壯性,也能讓開發者在使用 SDK 時更加清楚地了解每個方法的實現情況。這在 SDK 開發中是一個非常實用的模式,能夠有效地幫助開發者避免不必要的錯誤。

因為今天開發了一個通用基類SDK

有ABCDE…款遊戲,每個遊戲,SDK有自己客製的部分,當用未實現的方法被使用者調用時,丟出異常 然後用 try catch 接住。

這樣 就可以不只是Unity可以用這個SDK,替換成其他的影擎也可以了。

使用者就會知道 阿這個應該是 用錯SDK了,或是通知公司需要更新SDK了。

這裡的SDK 指的是 封裝成Dll 的程序集。

在開發的過程中 還需要考慮其他插件常用的dll 避免版本衝突。

Tags: