P.7:尽早捕获运行时错误

本文探讨了如何通过修改函数定义和使用方式来减少潜在的崩溃风险,提供三个实例分析了错误易发点,并给出反例以展示正确处理边界条件的重要性。此外,还涉及了物理意义检查和数据类型安全的考虑。

原因:避免“神秘”崩溃。

避免导致(可能无法识别)的错误。

例子

void increment1(int* p, int n)    // bad: error-prone
{
    for (int i = 0; i < n; ++i) ++p[i];
}

void use1(int m)
{
    const int n = 10;
    int a[n] = {};
    // ...
    increment1(a, m);   // maybe typo, maybe m <= n is supposed
                        // but assume that m == 20
    // ...
}

void increment2(span<int> p)
{
    for (int& x : p) ++x;
}

void use2(int m)
{
    const int n = 10;
    int a[n] = {};
    // ...
    increment2({a, m});    // maybe typo, maybe m <= n is supposed
    // ...
}

void use3(int m)
{
    const int n = 10;
    int a[n] = {};
    // ...
    increment2(a);   // the number of elements of a need not be repeated
    // ...
}

反例

Date read_date(istream& is);    // read date from istream

Date extract_date(const string& s);    // extract date from string

void user1(const string& date)    // manipulate date
{
    auto d = extract_date(date);
    // ...
}

void user2()
{
    Date d = read_date(cin);
    // ...
    user1(d.to_string());
    // ...
}

class Jet {    // Physics says: e * e < x * x + y * y + z * z
    float x;
    float y;
    float z;
    float e;
public:
    Jet(float x, float y, float z, float e)
        :x(x), y(y), z(z), e(e)
    {
        // Should I check here that the values are physically meaningful?
    }

    float m() const
    {
        // Should I handle the degenerate case here?
        return sqrt(x * x + y * y + z * z - e * e);
    }

    ???
};

2025-09-25 19:09:23.840 (mala] INFO Ilfcom.huawel.foundation.commons.netrics.MemeoryMetricsCllent.40] memeory metrics elient created 2025-09-25 19:09:25.265 (malal INFO (lfe.h.foundation.commoas.reflections.AnnotationMetadataReader.841 resolve class annotations from package: com.huawei in class loadersr org springframework.boot.loader.launch.LaunchedClassloader03a022576 cost 902ms 2025-09-25 19:09:25.279 (maln] INFO (lfc.huawei.foundation.commons.reflections.AnnotationsScanner.195] scan and match annotations HeanMappings,ReanMapping,MappingConfigurations from com huawei cost 13ms кuZZ6 1800 pUR [Temanq B00] 20sssssбaб4ssssdetS了ha3 рUR 0ROR [StZ A:on0sдбoIddeх Кpohoмд дaтdoo GOвO воfерCno] TeRenQ BCO][] GANI [UTPW] OOZ SZ:SO(61 SZ-60-SzOZ 2025-09-25 19:09:25.318 (main] INPO [lfc.h.foundation.commons.system.sempler.RuntimeSamplerFactory.341 Corrent RuntimeSampler is ' com,huawei, foundation,commons, ayatem, sempler.MXBeanRuntimeSampler' 2025-09-25 19:09:25.318 (main] INPO []c.h.foundation.Comnons.system.sampler.AbstractRuntimeSampler.75] Runtime sampler started 2025-09-25 19:09:25.770 (main] INFO [lforg.nongodb.driver.closter.711 Adding discovered server S(mongosource.urll:27017 to client view of cluster от вотаdеаха (9と1аеркотагаватаргаровово бао11] оам1 1LТOLZミ(там воснокобоов)@-(.1119, ooдndтаокор ".JOt9 (V19SS9c0OqS ZZSP99, onqea)praenento-renento) si8 sziso181 sz-60-sz0z monitor thread while connecting to server $(mongosource.ur1]:27017 com.mongodb.MongoSocketException: S{nongosource.urll: Name or service not known at com.mongodb.internal.connection.ServerAddressllelper.getSocketAddresses(ServerAddresalelper,jave:75) at com.mongodb.internal.connection.SocketStrwem,inftiallzeSocket(SocketStreem,jave:100) at com mongodb,internal,connection.SocketStrwam,open(SocketStreem.jave:79)的 at com mongodb,internal,connection.IaternalStreanConnection.open(InternalStreamConnection,jave:233) (81Z:PAиГ'доптаокиватеSатнеде0) сотадтаокедавлзерд1ХО01 1 20310ожг8АзедС203твоугеАзедатпедед вотаавсввог [уалецит аробоов воа пв at com.mongodb.internal.connection.DefaultServerMonitorSServerMonitor.run(DefaultServerMonitor.java:176) Caused by: java.net.UnknownHostException: S{nongosource.url}: Name or service not knowa at java.base/java.net.InetfAddressimpl.lookupA11HostAddr(Native Method) at java.base/java.net.InetfAddressInpl.lookupAl1HostAddr(Inet6Addressimpl.java:32) at java.bese/jave.net.InetAddressSPIatformResolver.lookupByName InetAddreas,jave:1211) at java.base/java.net.InetAddress.getAddressesFromNaneService(InetAddress.java:1828) at java.bese/jave.net.InetAddressONaneServiceAddonases.get(InetAddreas,java:1139)的 at java.base/java.net.InetAddress.getA11ByNameO(InetAddreas.jave:1918)的 at java.bese/jave.net.InetAddreas.getA11ByName(InetAddeess,java:1600) at com.mongodb.internal.connection.DefaultTnetAddressResolver.lookupByName(DefaultInetAddressResolver.Java:34) at com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses(ServerAddressHelper.Java:71) ... 5 common frames cmitted 2025-09-25 19:09:26.053 (mainl INFO [lforg.mongodb.driver.elient.711 KongoCllent with metadate f\"deivert": (\"aame\": \"mongo-jave-deiverlsynclapring-boot\", \"version\"; 代はのg1w1da\ “(m\p9日21e*Ze201O1 Z001210S10181109-0101 Sa\ 3a Cors2eA,\ ". p9q3PP.\ :a eompеатц3Ra\ ", xn01T.5 :a R0P0, xn0TTa\ Sa 9dA1a\ト :. S0.\ “{a\T”ZSu \"Jave/Bisheng/21.0.7+8\", \"env\": {A"container\": {\"orchestrator ": A"kubernetes "}}} created with settings MongoClientSettings(readPreferencemprimary, aade ee ывв a а ta de
09-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值