Là đảm bảo an toàn ngoại lệ mạnh mẽ với một đối số thông qua giá trị có thể gây ra sự hủy diệt có thể?


8

Giả sử bạn có một loại với hàm hủy ném và hàm nhận nó theo giá trị.
Hoạt động đó có thể cung cấp bất cứ điều gì tốt hơn so với đảm bảo ngoại lệ cơ bản?
Hoặc được xây dựng theo cách khác nhau, liệu người ta có thể bỏ qua việc phá hủy đối số được truyền theo giá trị khi xác định liệu một hoạt động có bắt buộc và khôi phục ngữ nghĩa không?

#include <cstdlib>

struct X {
    ~X() noexcept(0) {
        if(rand()%6 == 0) throw 0;
    }
    // some state
};

void update(database db, X arg) noexcept;

X x;
update(db, x);

Cá nhân, dựa trên định nghĩa từ wikipedia

  1. An toàn ngoại lệ mạnh , còn được gọi là ngữ nghĩa cam kết hoặc khôi phục : Các hoạt động có thể thất bại, nhưng các hoạt động thất bại được đảm bảo không có tác dụng phụ, vì vậy tất cả dữ liệu đều giữ nguyên giá trị ban đầu của chúng

Tôi không nghĩ rằng nó hữu ích để mô tả updatelà cực kỳ an toàn ngoại lệ, mặc dù chức năng thậm chí không thể ném.

Tôi sẽ đánh giá cao một ai đó cho tôi thấy sự điên rồ của sự hiểu biết hiện tại của tôi, hoặc đưa ra một lập luận tốt hơn.


Điều gì xảy ra nếu một phương thức trong lớp ném và người gọi quyết định loại bỏ đối tượng? Kẻ hủy diệt vẫn sẽ đóng giao dịch?
Robert Harvey

Phương pháp trong lớp nào? Và đóng giao dịch gì? Xin lỗi, nhưng tôi đang bối rối.
Ded repeatator

Chà, trừ khi một mẫu vật lưu niệm đang được sử dụng hoặc giao dịch cơ sở dữ liệu có liên quan, tôi không thấy trạng thái của lớp không bị mất khi đối tượng bị loại bỏ, trừ khi bạn nói đó là một lớp không trạng thái.
Robert Harvey

2
Câu hỏi đã được lấy cảm hứng từ tranh luận ở đây: chat.stackexchange.com/rooms/32049/... chat.stackexchange.com/rooms/32061/...
Deduplicator

4
Nói chung, một tàu khu trục ném là chất độc hoàn toàn cho tất cả các đảm bảo an toàn ngoại lệ. Nó chỉ trở nên khó khăn hơn bởi các đơn đặt hàng lớn.
Sebastian Redl

Câu trả lời:


7

Tôi không thực sự chắc chắn khi nhìn lại, nhưng nếu updatechung chung hoặc nếu Xtrừu tượng (ví dụ: nhân bản và bị phá hủy) - nghĩa là, nếu updatekhông thể biết bất cứ điều gì cụ thể X, thì với tất cả các mục đích thực tế, tôi mô tả nó là mạnh mẽ đảm bảo an toàn ngoại lệ. Ít nhất là gần với một đảm bảo an toàn ngoại lệ mạnh mẽ mà bạn từng có trong một bối cảnh trừu tượng mà không cần chụp x-quang một loại dữ liệu.

Tuy nhiên, Xlà cụ thể, do đó làm cho câu hỏi này mờ hơn rất nhiều. Tôi vẫn muốn nói rằng update"có một đảm bảo an toàn ngoại lệ mạnh mẽ" vì nó đang làm mọi thứ có thể có thể để thực thi nó. Nghe có vẻ như nói chuyện điên rồ? Nó làm với tôi, nhưng tôi thực sự không thể đặt nó tốt hơn nhiều.

Đặc biệt là trong bối cảnh môi trường nhóm nơi một tác giả thực hiện updatevà các tác giả khác X, không có gì có thể cung cấp một đảm bảo an toàn ngoại lệ mạnh mẽ vì Xcó thể được sửa đổi theo cách phá vỡ sự bảo đảm theo cách hoàn toàn ngoài tầm kiểm soát update. Đối với các mục đích thực tế, tôi nghĩ rằng nếu updatelàm mọi thứ có thể và nên khôi phục các tác dụng phụ của chính nó trong các đường dẫn đặc biệt, thì thực tế nó cung cấp một đảm bảo an toàn ngoại lệ mạnh mẽ.

Mặt khác, đảm bảo an toàn ngoại lệ mạnh mẽ trở thành một cái gì đó không thực tế để cung cấp trong rất nhiều tình huống. Mọi thứ có thể thay đổi ngoài tầm kiểm soát của chức năng. Mọi thứ có thể trừu tượng theo những cách vượt ra ngoài kiến ​​thức của chức năng. Toàn bộ đảm bảo sẽ gần như không thể cung cấp bất cứ nơi nào. Trong trường hợp đó, chúng tôi có thể nói rằng bảo đảm ngoại lệ mạnh mẽ updatetuyên truyền trách nhiệm Xtuân thủ, hoặc updatecó bắt buộc phải biết cách Xthực hiện mọi lúc không? Tôi không biết. Đây là tất cả rất không thực tế, và tôi không thích sự không thực tế.

Vì vậy, tôi sẽ đi với sự thô thiển, ừ, " updatelà ngoại lệ an toàn, nhưng Xđã biến mất và làm rối tung mọi thứ. update'sÍt nhất đó không phải là lỗi. Đừng kiện tác giả cập nhật! Kiện tác giả của X!" . Tôi muốn mô tả Xđơn giản là fubar ở đây, và updatenhư có thể cung cấp một đảm bảo an toàn ngoại lệ mạnh mẽ đang bị ràng buộc bởi thực tế đó Xlà fubar. Đó là, trừ khi có một sự hiểu biết ở cấp độ giao diện rất khó mà bộ X'shủy được thiết kế để ném, trong trường hợp đó tôi không biết làm thế nào để mô tả nó ngoại trừ là một "vấn đề lớn". Tôi nghĩ rằng chúng tôi cần một số bản in và từ chối tốt để đi kèm với những đảm bảo này.cập nhật cung cấp một đảm bảo an toàn ngoại lệ mạnh với điều kiện [...]. Không hoàn lại tiền nếu đây không phải là trường hợp!

Đây giống như một câu hỏi triết học đối với tôi, thú vị để suy nghĩ nhưng có lẽ một câu hỏi không có câu trả lời hoàn hảo. Và đảm bảo là gì? Chúng tôi có thể đảm bảo bất cứ điều gì? Tôi có thể đảm bảo rằng uống bia sẽ khiến tôi say và điều đó dường như luôn luôn đúng, nhưng điều gì sẽ xảy ra nếu một người ngoài hành tinh can thiệp và sử dụng một loại công nghệ ngoài hành tinh nào đó khiến tôi tỉnh táo cho dù tôi có uống bao nhiêu? Tôi không thể đảm bảorằng điều này sẽ không xảy ra. Tôi chỉ có thể nói rằng điều này rất khó khả thi và nếu sự kiện đó xảy ra, tôi sẽ bất lực trước nó. Tôi đã làm một phần của tôi. Tôi uống bia của tôi. Tôi phải say. Tôi mạnh mẽ đảm bảo nó. Nhưng nó không chắc chắn. Luôn có một số xác suất, tuy nhiên từ xa về mặt thiên văn, rằng sự đảm bảo có thể không đúng. Làm thế nào về an toàn chủ đề? Chà, điều gì sẽ xảy ra nếu tàu vũ trụ của người ngoài hành tinh đến và đánh bại phần cứng của chúng ta và sắp xếp lại các hướng dẫn trong bộ nhớ sao cho một chức năng an toàn chủ đề chính thức giờ đây không còn an toàn cho luồng khi chạy? Tôi không thể đảm bảo rằng điều này sẽ không xảy ra. Nhưng tôi sẽ đảm bảo an toàn luồng cho dù không đi sâu vào những bản in đẹp như vậy về tàu không gian ngoài hành tinh, bởi vì nó khiến mọi người cảm thấy dễ chịu và yên tâm, và điều tôi đang nói là tôi

Descartes đã từng nói: "Tôi nghĩ do đó, tôi là." Làm sao anh ấy biết? Nếu anh ta không thì sao? Anh ta có thể là "không" nhưng có lẽ "không" có thể "nghĩ". Tôi thậm chí không biết nếu tôi tồn tại. Dù sao thì suy nghĩ cũng có nghĩa là gì? Nó giống như một từ mà mọi người sử dụng để mô tả một số quá trình dường như tiếp tục hướng nội và xuất hiện như thể chúng ta, người thậm chí không tồn tại, đang đưa ra quyết định.

Điều gì xảy ra nếu tất cả chúng ta chỉ là bit và byte trên một số máy? Giống như cô gái tóc vàng hoặc tóc nâu trong Ma trận. Nhân tiện, làm thế nào một cô gái tóc vàng hoặc đặc biệt là tóc nâu có thể được lưu trữ trong một dòng nhân vật nhỏ như vậy? Họ có thích UTF2048 không? Đó là một loại nhân vật ngoài hành tinh nhưng dường như không có quá nhiều nhân vật độc đáo. Có lẽ đó là một số loại chức năng gọi. Dù sao, tôi không chắc chúng tôi có thể đảm bảo bất cứ điều gì. Tất cả đều liên quan đến những gì chúng ta tin là đúng.


5
"Vì vậy," an toàn ngoại lệ "của bất kỳ loại và" ném hủy "nào có lẽ không bao giờ nên được kết hợp trong cùng một câu. Chúng, cho tất cả các mục đích thực tế, loại trừ lẫn nhau." +1, không thể tranh luận với logic đó. Nếu bạn nghĩ rằng bạn có thể, bạn không logic.

Tôi không thấy cách này trả lời câu hỏi ban đầu. Vấn đề ở đây là arg sẽ phá hủy chính xác khi thoát hàm. Các chức năng sẽ không có cơ hội để nắm bắt điều này. Nếu chức năng đã làm một cái gì đó, nó sẽ không có cơ hội để khôi phục nó.
Nir Friedman

2
Vâng, đó là kết luận chính xác, nó không trở nên ít chính xác hơn bởi khó chịu. Trong trường hợp của vectơ, nó là bất hợp pháp đối với hàm hủy của loại bao giờ ném: stackoverflow.com/questions/26902006/ . Tôi hiểu cách tiếp cận "hướng theo nhóm" của bạn, nhưng thật lòng mà nói, nó nhìn từ góc độ công bằng hơn là tính chính xác.
Nir Friedman

2
Giải thích ưa thích của tôi chỉ đơn giản là việc ném vào hàm hủy là hành vi không xác định và ngoại lệ nào đảm bảo chức năng đều dựa trên giả định ngầm định rằng không có hành vi không xác định nào xảy ra (thực sự, mọi thứ trong ngôn ngữ đều đưa ra giả định đó). Nếu hành vi không xác định có thể bao gồm định dạng ổ cứng của bạn, thì chắc chắn nó có thể bao gồm vi phạm các đảm bảo ngoại lệ chính xác khác của mọi thứ khác trong chương trình.
Ixrec

1
@Ixrec Đó có thể là cách giải thích ưa thích của bạn, nhưng nói chung việc ném từ một kẻ hủy diệt không phải là nói chung, đó đơn giản là một sự thật.
Nir Friedman

-1

Về mặt kỹ thuật, nó có thể cung cấp sự đảm bảo ngoại lệ mạnh mẽ. Có nghĩa là, nó chỉ có thể cung cấp bảo đảm ngoại lệ mạnh mẽ trong trường hợp tầm thường mà nó không làm gì cả.

Herb Sutter nói về một trường hợp tương tự (và trực quan hơn) trong đó một hàm lấy một đối số theo giá trị có hàm tạo sao chép ném. Bạn có thể gắn nhãn như vậy không có chức năng. Về mặt kỹ thuật, ngoại lệ xảy ra trong "keo" giữa mã gọi và hàm được gọi, chứ không phải bên trong hàm. Đó là trường hợp ở đây là tốt. Vì ngoại lệ không được ném kỹ thuật vào bên trong bản cập nhật, nên bạn có thể (có thể) cho rằng bản thân bản cập nhật không tạo ra lỗi và do đó có thể cung cấp bảo đảm ngoại lệ mạnh.

Thực tế mà nói, nếu cập nhật làm bất cứ điều gì, thì việc gọi nó (và không làm gì khác) có thể dẫn đến tình trạng thế giới thay đổi và một ngoại lệ bị ném, phá vỡ sự bảo đảm ngoại lệ mạnh mẽ.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
maple_shaft
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.